Tutorial de RNN (red neuronal recurrente): ejemplo de TensorFlow

ยฟPor quรฉ necesitamos una red neuronal recurrente (RNN)?

La red neuronal recurrente (RNN) le permite modelar unidades de memoria para conservar datos y modelar dependencias a corto plazo. Tambiรฉn se utiliza en pronรณsticos de series de tiempo para la identificaciรณn de correlaciones y patrones de datos. Tambiรฉn ayuda a producir resultados predictivos para datos secuenciales al ofrecer un comportamiento similar al del cerebro humano.

La estructura de una red neuronal artificial es relativamente simple y se trata principalmente de multiplicaciรณn de matrices. Durante el primer paso, las entradas se multiplican por pesos inicialmente aleatorios y el sesgo se transforma con una funciรณn de activaciรณn y los valores de salida se utilizan para hacer una predicciรณn. Este paso da una idea de quรฉ tan lejos estรก la red de la realidad.

La mรฉtrica aplicada es la pรฉrdida. Cuanto mayor sea la funciรณn de pรฉrdida, mรกs tonto serรก el modelo. Para mejorar el conocimiento de la red, se requiere cierta optimizaciรณn mediante el ajuste de los pesos de la red. El descenso de gradiente estocรกstico es el mรฉtodo empleado para cambiar los valores de los pesos en la direcciรณn correcta. Una vez realizado el ajuste, la red puede utilizar otro lote de datos para probar su nuevo conocimiento.

Afortunadamente, el error es menor que antes, aunque no lo suficientemente pequeรฑo. El paso de optimizaciรณn se realiza de forma iterativa hasta que se minimiza el error, es decir, no se puede extraer mรกs informaciรณn.

El problema de este tipo de modelo es que no tiene memoria. Significa que la entrada y la salida son independientes. En otras palabras, al modelo no le importa lo que vino antes. Plantea algunas dudas cuando es necesario predecir series de tiempo o oraciones porque la red necesita tener informaciรณn sobre datos histรณricos o palabras pasadas.

Para superar este problema, se ha desarrollado un nuevo tipo de arquitectura: Red neuronal recurrente (RNN en adelante).

ยฟQuรฉ es una red neuronal recurrente (RNN)?

A Red neuronal recurrente (RNN) es una clase de Red neuronal artificial en el que la conexiรณn entre diferentes nodos forma un grรกfico dirigido para dar un comportamiento dinรกmico temporal. Ayuda a modelar datos secuenciales que se derivan de redes de alimentaciรณn directa. Funciona de manera similar al cerebro humano para ofrecer resultados predictivos.

Una red neuronal recurrente se parece bastante a una red neuronal tradicional, excepto que se agrega un estado de memoria a las neuronas. El cรกlculo para incluir una memoria es sencillo.

Imagine un modelo simple con una sola neurona alimentada por un lote de datos. En una red neuronal tradicional, el modelo produce la salida multiplicando la entrada por el peso y la funciรณn de activaciรณn. Con un RNN, esta salida se envรญa a sรญ misma varias veces. Llamamos hora de caminar la cantidad de tiempo que la salida se convierte en la entrada de la siguiente multiplicaciรณn de matrices.

Por ejemplo, en la imagen siguiente, puede ver que la red estรก compuesta por una neurona. La red calcula la multiplicaciรณn de matrices entre la entrada y el peso y agrega no linealidad con la funciรณn de activaciรณn. Se convierte en la salida en t-1. Esta salida es la entrada de la segunda multiplicaciรณn de matrices.

Red neuronal recurrente (RNN)
Red neuronal recurrente (RNN)

A continuaciรณn, codificamos un RNN simple en TensorFlow para comprender el paso y tambiรฉn la forma de la salida.

La red estรก compuesta por:

  • Cuatro entradas
  • Seis neuronas
  • pasos de 2 veces

La red procederรก como se muestra en la siguiente imagen.

Red neuronal recurrente (RNN)

La red se denomina "recurrente" porque realiza la misma operaciรณn en cada casilla de activaciรณn. La red calcula los pesos de las entradas y la salida anterior antes de utilizar una funciรณn de activaciรณn.

import numpy as np
import tensorflow as tf
n_inputs = 4
n_neurons = 6
n_timesteps = 2
The data is a sequence of a number from 0 to 9 and divided into three batches of data.
## Data 
X_batch = np.array([
        [[0, 1, 2, 5], [9, 8, 7, 4]], # Batch 1
        [[3, 4, 5, 2], [0, 0, 0, 0]], # Batch 2
        [[6, 7, 8, 5], [6, 5, 4, 2]], # Batch 3
    ])

Podemos construir la red con un marcador de posiciรณn para los datos, la etapa recurrente y la salida.

  1. Definir el marcador de posiciรณn para los datos.
X = tf.placeholder(tf.float32, [None, n_timesteps, n_inputs])

Aquรญ:

  • Ninguno: Desconocido y tomarรก el tamaรฑo del lote.
  • n_timesteps: nรบmero de veces que la red enviarรก la salida a la neurona
  • n_inputs: nรบmero de entradas por lote
  1. Definir la red recurrente

Como se menciona en la imagen de arriba, la red estรก compuesta por 6 neuronas. La red calcularรก dos productos escalares:

  • Ingrese datos con el primer conjunto de pesos (es decir, 6: igual al nรบmero de neuronas)
  • Salida anterior con un segundo conjunto de pesos (es decir, 6: correspondiente al nรบmero de salida)

Tenga en cuenta que, durante el primer avance, los valores de la salida anterior son iguales a ceros porque no tenemos ningรบn valor disponible.

El objeto para construir un RNN es tf.contrib.rnn.BasicRNNCell con el argumento num_units para definir el nรบmero de entradas

basic_cell = tf.contrib.rnn.BasicRNNCell(num_units=n_neurons)

Ahora que la red estรก definida, puede calcular las salidas y los estados.

outputs, states = tf.nn.dynamic_rnn(basic_cell, X, dtype=tf.float32)

Este objeto utiliza un bucle interno para multiplicar las matrices el nรบmero apropiado de veces.

Tenga en cuenta que la neurona recurrente es una funciรณn de todas las entradas de los pasos de tiempo anteriores. Asรญ es como la red construye su propia memoria. La informaciรณn del tiempo anterior puede propagarse en el futuro. Esta es la magia de la red neuronal recurrente

## Define the shape of the tensor
X = tf.placeholder(tf.float32, [None, n_timesteps, n_inputs])
## Define the network
basic_cell = tf.contrib.rnn.BasicRNNCell(num_units=n_neurons)
outputs, states = tf.nn.dynamic_rnn(basic_cell, X, dtype=tf.float32)
init = tf.global_variables_initializer()
init = tf.global_variables_initializer()
with tf.Session() as sess:
    init.run()
    outputs_val = outputs.eval(feed_dict={X: X_batch})
print(states.eval(feed_dict={X: X_batch}))
[[ 0.38941205 -0.9980438   0.99750966  0.7892596   0.9978241   0.9999997 ]
 [ 0.61096436  0.7255889   0.82977575 -0.88226104  0.29261455 -0.15597084]
 [ 0.62091285 -0.87023467  0.99729395 -0.58261937  0.9811445   0.99969864]]

Para fines explicativos, se imprimen los valores del estado anterior. El resultado impreso arriba muestra el resultado del รบltimo estado. Ahora imprima todos los resultados, puede notar que los estados son los resultados anteriores de cada lote. Es decir, la salida anterior contiene la informaciรณn sobre toda la secuencia.

print(outputs_val)    
print(outputs_val.shape)    
[[[-0.75934666 -0.99537754  0.9735819  -0.9722234  -0.14234993
   -0.9984044 ]
  [ 0.99975264 -0.9983206   0.9999993  -1.         -0.9997506
   -1.        ]]

 [[ 0.97486496 -0.98773265  0.9969686  -0.99950117 -0.7092863
   -0.99998885]
  [ 0.9326837   0.2673438   0.2808514  -0.7535883  -0.43337247
    0.5700631 ]]

 [[ 0.99628735 -0.9998728   0.99999213 -0.99999976 -0.9884324
   -1.        ]
  [ 0.99962527 -0.9467421   0.9997403  -0.99999714 -0.99929446
   -0.9999795 ]]]
(3, 2, 6)

Red neuronal recurrente (RNN)

La salida tiene la forma de (3, 2, 6):

  • 3: Nรบmero de lotes
  • 2: Nรบmero del paso de tiempo
  • 6: Nรบmero de neuronas

La optimizaciรณn de una red neuronal recurrente es idรฉntica a la de una red neuronal tradicional. Verรก con mรกs detalle cรณmo optimizar el cรณdigo en la siguiente parte de este tutorial de Red neuronal recurrente.

Aplicaciones de RNN

RNN tiene mรบltiples usos, especialmente cuando se trata de predecir el futuro. En la industria financiera, RNN puede resultar รบtil para predecir los precios de las acciones o el signo de la direcciรณn del mercado de valores (es decir, positivo o negativo).

RNN es รบtil para un coche autรณnomo ya que puede evitar un accidente automovilรญstico anticipando la trayectoria del vehรญculo.

RNN se utiliza ampliamente en anรกlisis de texto, subtรญtulos de imรกgenes, anรกlisis de sentimientos y traducciรณn automรกtica. Por ejemplo, se puede utilizar una reseรฑa de una pelรญcula para comprender el sentimiento que percibiรณ el espectador despuรฉs de ver la pelรญcula. Automatizar esta tarea es muy รบtil cuando la productora cinematogrรกfica no tiene tiempo suficiente para revisar, etiquetar, consolidar y analizar las reseรฑas. La mรกquina puede hacer el trabajo con un mayor nivel de precisiรณn.

Limitaciones de RNN

En teorรญa, se supone que RNN transporta la informaciรณn varias veces. Sin embargo, es bastante difรญcil propagar toda esta informaciรณn cuando el paso de tiempo es demasiado largo. Cuando una red tiene demasiadas capas profundas, se vuelve imposible de entrenar. Este problema se llama: problema de gradiente de fuga. Si recuerdas, la red neuronal actualiza el peso mediante el algoritmo de descenso de gradiente. Los gradientes se hacen mรกs pequeรฑos a medida que la red avanza hacia capas inferiores.

En conclusiรณn, los gradientes se mantienen constantes, lo que significa que no hay margen de mejora. El modelo aprende de un cambio en el gradiente; este cambio afecta la salida de la red. Sin embargo, si la diferencia en el gradiente es demasiado pequeรฑa (es decir, los pesos cambian un poco), la red no puede aprender nada y, por lo tanto, la salida. Por lo tanto, una red que enfrenta un problema de gradiente evanescente no puede converger hacia una buena soluciรณn.

Mejora LSTM

Para superar el problema potencial de la desapariciรณn del gradiente al que se enfrenta la RNN, tres investigadores, Hochreiter, Schmidhuber y Bengio mejoraron la RNN con una arquitectura llamada memoria de corto y largo plazo (LSTM). En resumen, la LSTM proporciona a la red informaciรณn relevante del pasado hasta tiempos mรกs recientes. La mรกquina utiliza una mejor arquitectura para seleccionar y llevar informaciรณn a tiempos posteriores.

La arquitectura LSTM estรก disponible en TensorFlow, tf.contrib.rnn.LSTMCell. LSTM estรก fuera del alcance del tutorial. Puede consultar el sitio web oficial documentaciรณn para mayor informaciรณn

RNN en series de tiempo

En este tutorial de TensorFlow RNN, utilizarรก un RNN con datos de series de tiempo. Las series de tiempo dependen del tiempo anterior, lo que significa que los valores pasados โ€‹โ€‹incluyen informaciรณn relevante de la que la red puede aprender. La idea detrรกs de la predicciรณn de series temporales es estimar el valor futuro de una serie, digamos, el precio de las acciones, la temperatura, el PIB, etc.

La preparaciรณn de datos para Keras RNN y series temporales puede ser un poco complicada. En primer lugar, el objetivo es predecir el siguiente valor de la serie, es decir, utilizarรก la informaciรณn pasada para estimar el valor en t + 1. La etiqueta es igual a la secuencia de entrada y se adelantรณ un perรญodo. En segundo lugar, el nรบmero de entradas se establece en 1, es decir, una observaciรณn por vez. Por รบltimo, el paso de tiempo es igual a la secuencia del valor numรฉrico. Por ejemplo, si establece el paso de tiempo en 10, la secuencia de entrada regresarรก diez veces consecutivas.

Mire el grรกfico a continuaciรณn, hemos representado los datos de la serie temporal a la izquierda y una secuencia de entrada ficticia a la derecha. Crea una funciรณn para devolver un conjunto de datos con valor aleatorio para cada dรญa desde enero de 2001 hasta diciembre de 2016.

# To plot pretty figures
%matplotlib inline
import matplotlib
import matplotlib.pyplot as plt
import pandas as pd
def create_ts(start = '2001', n = 201, freq = 'M'):
    rng = pd.date_range(start=start, periods=n, freq=freq)
    ts = pd.Series(np.random.uniform(-18, 18, size=len(rng)), rng).cumsum()
    return ts
ts= create_ts(start = '2001', n = 192, freq = 'M')
ts.tail(5)

Salida

2016-08-31    -93.459631
2016-09-30    -95.264791
2016-10-31    -95.551935
2016-11-30   -105.879611
2016-12-31   -123.729319
Freq: M, dtype: float64
ts = create_ts(start = '2001', n = 222)

# Left
plt.figure(figsize=(11,4))
plt.subplot(121)
plt.plot(ts.index, ts)
plt.plot(ts.index[90:100], ts[90:100], "b-", linewidth=3, label="A training instance")
plt.title("A time series (generated)", fontsize=14)

# Right
plt.subplot(122)
plt.title("A training instance", fontsize=14)
plt.plot(ts.index[90:100], ts[90:100], "b-", markersize=8, label="instance")
plt.plot(ts.index[91:101], ts[91:101], "bo", markersize=10, label="target", markerfacecolor='red')
plt.legend(loc="upper left")
plt.xlabel("Time")

plt.show()

RNN en series temporales

La parte derecha del grรกfico muestra todas las series. Comenzรณ en 2001 y termina en 2019. No tiene sentido introducir todos los datos en la red, sino que es necesario crear un lote de datos con una longitud igual al paso de tiempo. Este lote serรก la variable X. La variable Y es la misma que X pero desplazada un perรญodo (es decir, se desea pronosticar t+1).

Ambos vectores tienen la misma longitud. Puedes verlo en la parte derecha del grรกfico anterior. La lรญnea representa los diez valores de la entrada X, mientras que los puntos rojos son los diez valores de la etiqueta, Y. Tenga en cuenta que la etiqueta comienza un perรญodo antes de X y termina un perรญodo despuรฉs.

Cree un RNN para predecir series temporales en TensorFlow

Ahora, en este entrenamiento de RNN, es el momento de crear su primer RNN para predecir la serie anterior. Debe especificar algunos hiperparรกmetros (los parรกmetros del modelo, es decir, el nรบmero de neuronas, etc.) para el modelo:

  • Nรบmero de entrada: 1
  • Paso de tiempo (ventanas en series de tiempo): 10
  • Nรบmero de neuronas: 120
  • Nรบmero de salida: 1

Su red aprenderรก en una secuencia de 10 dรญas y contendrรก 120 neuronas recurrentes. Alimenta el modelo con una entrada, es decir, un dรญa. Siรฉntase libre de cambiar los valores para ver si el modelo mejorรณ.

Antes de construir el modelo, es necesario dividir el conjunto de datos en un conjunto de entrenamiento y un conjunto de prueba. El conjunto de datos completo tiene 222 puntos de datos; Utilizarรก los primeros 201 puntos para entrenar el modelo y los รบltimos 21 puntos para probar su modelo.

Despuรฉs de definir un tren y un conjunto de prueba, debe crear un objeto que contenga los lotes. En estos lotes, tiene valores X e Y. Recuerde que los valores de X tienen un retraso de un perรญodo. Por lo tanto, utiliza las primeras 200 observaciones y el paso de tiempo es igual a 10. El objeto X_batches debe contener 20 lotes de tamaรฑo 10*1. Los y_batches tienen la misma forma que el objeto X_batches pero con un punto por delante.

Paso 1) Crea el tren y prueba.

En primer lugar, conviertes la serie en una numpy matriz; luego, define las ventanas (es decir, la cantidad de veces que la red aprenderรก), la cantidad de entradas, salidas y el tamaรฑo del conjunto de entrenamiento como se muestra en el ejemplo de TensorFlow RNN a continuaciรณn.

series = np.array(ts)
n_windows = 20   
n_input =  1
n_output = 1
size_train = 201

Despuรฉs de eso, simplemente divide la matriz en dos conjuntos de datos.

## Split data
train = series[:size_train]
test = series[size_train:]
print(train.shape, test.shape)
(201,) (21,)

Paso 2) Cree la funciรณn para devolver X_batches e y_batches

Para hacerlo mรกs fรกcil, puede crear una funciรณn que devuelva dos matrices diferentes, una para X_batches y otra para y_batches.

Escribamos una funciรณn RNN TensorFlow para construir los lotes.

Nรณtese que los lotes X estรกn retrasados โ€‹โ€‹por un perรญodo (tomamos el valor t-1). La salida de la funciรณn debe tener tres dimensiones. La primera dimensiรณn equivale al nรบmero de lotes, la segunda al tamaรฑo de las ventanas y la รบltima al nรบmero de entradas.

La parte complicada es seleccionar los puntos de datos correctamente. Para los puntos de datos X, elige las observaciones de t = 1 a t =200, mientras que para el punto de datos Y, devuelve las observaciones de t = 2 a 201. Una vez que tenga los puntos de datos correctos, es sencillo remodelar las series.

Para construir el objeto con los lotes, debe dividir el conjunto de datos en diez lotes de igual longitud (es decir, 20). Puede utilizar el mรฉtodo de remodelaciรณn y pasar -1 para que la serie sea similar al tamaรฑo del lote. El valor 20 es el nรบmero de observaciones por lote y 1 es el nรบmero de entradas.

Debes hacer el mismo paso pero para la etiqueta.

Tenga en cuenta que debe desplazar los datos segรบn la cantidad de veces que desea pronosticar. Por ejemplo, si desea pronosticar un dรญa, debe desplazar la serie en 1. Si desea pronosticar dos dรญas, debe desplazar los datos en 2.

x_data = train[:size_train-1]: Select all the training instance minus one day
X_batches = x_data.reshape(-1, windows, input): create the right shape for the batch e.g (10, 20, 1)
def create_batches(df, windows, input, output):
    ## Create X         
        x_data = train[:size_train-1] # Select the data
        X_batches = x_data.reshape(-1, windows, input)  # Reshape the data 
    ## Create y
        y_data = train[n_output:size_train]
        y_batches = y_data.reshape(-1, windows, output)
        return X_batches, y_batches

Ahora que la funciรณn estรก definida, puede llamarla para crear los lotes como se muestra en el siguiente ejemplo de RNN.

X_batches, y_batches = create_batches(df = train,
                                      windows = n_windows,
                                      input = n_input,
                                      output = n_output)

Puede imprimir la forma para asegurarse de que las dimensiones sean correctas.

print(X_batches.shape, y_batches.shape)
(10, 20, 1) (10, 20, 1)

Debe crear el conjunto de prueba con solo un lote de datos y 20 observaciones.

Tenga en cuenta que, si pronostica dรญas tras dรญas, significa que el segundo valor previsto se basarรก en el valor real del primer dรญa (t+1) del conjunto de datos de prueba. De hecho, se conocerรก el verdadero valor.

Si desea pronosticar t+2 (es decir, con dos dรญas de antelaciรณn), debe utilizar el valor previsto t+1; Si va a predecir t+3 (con tres dรญas de anticipaciรณn), debe usar el valor predicho t+1 y t+2. Tiene sentido que sea difรญcil predecir con precisiรณn t+n dรญas de antelaciรณn.

X_test, y_test = create_batches(df = test, windows = 20,input = 1, output = 1)
print(X_test.shape, y_test.shape)
(10, 20, 1) (10, 20, 1)

Muy bien, el tamaรฑo del lote estรก listo, puedes construir la arquitectura de la red neuronal recurrente. Recuerda que tienes 120 neuronas recurrentes.

Paso 3) Construye el modelo

Para crear el modelo, es necesario definir tres partes:

  1. La variable con los tensores.
  2. el RNN
  3. La pรฉrdida y la optimizaciรณn.

Paso 3.1) Variables

Debe especificar las variables X e y con la forma adecuada. Este paso es trivial. El tensor tiene la misma dimensiรณn que los objetos X_batches e y_batches.

Por ejemplo, el tensor X es un marcador de posiciรณn (consulte el tutorial sobre Introducciรณn a Flujo tensor para refrescar su mente sobre la declaraciรณn de variables) tiene tres dimensiones:

  • Nota: tamaรฑo del lote
  • n_windows: Longitud de las ventanas, es decir, el nรบmero de veces que el modelo mira hacia atrรกs
  • n_input: nรบmero de entrada

El resultado es:

tf.placeholder(tf.float32, [None, n_windows, n_input])
## 1. Construct the tensors
X = tf.placeholder(tf.float32, [None, n_windows, n_input])   
y = tf.placeholder(tf.float32, [None, n_windows, n_output])

Paso 3.2) Crear el RNN

En la segunda parte de este ejemplo de RNN de TensorFlow, debe definir la arquitectura de la red. Como antes, utilice el objeto BasicRNNCell y dynamic_rnn del estimador de TensorFlow.

## 2. create the model
basic_cell = tf.contrib.rnn.BasicRNNCell(num_units=r_neuron, activation=tf.nn.relu)   
rnn_output, states = tf.nn.dynamic_rnn(basic_cell, X, dtype=tf.float32)   

La siguiente parte es un poco mรกs complicada pero permite un cรกlculo mรกs rรกpido. Debe transformar la salida de la ejecuciรณn en una capa densa y luego convertirla nuevamente para que tenga la misma dimensiรณn que la entrada.

stacked_rnn_output = tf.reshape(rnn_output, [-1, r_neuron])          
stacked_outputs = tf.layers.dense(stacked_rnn_output, n_output)       
outputs = tf.reshape(stacked_outputs, [-1, n_windows, n_output])  

Paso 3.3) Crear la pรฉrdida y optimizaciรณn.

La optimizaciรณn del modelo depende de la tarea que estรฉ realizando. En el tutorial anterior sobre CNN, su objetivo era clasificar imรกgenes; en este tutorial de RNN, el objetivo es ligeramente diferente. Se le pide que haga una predicciรณn sobre una variable continua en comparaciรณn con una clase.

Esta diferencia es importante porque cambiarรก el problema de optimizaciรณn. El problema de optimizaciรณn para una variable continua es minimizar el error cuadrรกtico medio. Para construir estas mรฉtricas en TF, puede utilizar:

  • tf.reduce_sum(tf.square(salidas โ€“ y))

El resto del cรณdigo RNN es el mismo que antes; utiliza un optimizador Adam para reducir la pรฉrdida (es decir, MSE):

  • tf.train.AdamOptimizer(tasa_de_aprendizaje=tasa_de_aprendizaje)
  • optimizador.minimizar (pรฉrdida)

Eso es todo, puedes empacar todo junto y tu modelo estarรก listo para entrenar.

tf.reset_default_graph()
r_neuron = 120    

## 1. Construct the tensors
X = tf.placeholder(tf.float32, [None, n_windows, n_input])   
y = tf.placeholder(tf.float32, [None, n_windows, n_output])

## 2. create the model
basic_cell = tf.contrib.rnn.BasicRNNCell(num_units=r_neuron, activation=tf.nn.relu)   
rnn_output, states = tf.nn.dynamic_rnn(basic_cell, X, dtype=tf.float32)              

stacked_rnn_output = tf.reshape(rnn_output, [-1, r_neuron])          
stacked_outputs = tf.layers.dense(stacked_rnn_output, n_output)       
outputs = tf.reshape(stacked_outputs, [-1, n_windows, n_output])   

## 3. Loss + optimization
learning_rate = 0.001  
 
loss = tf.reduce_sum(tf.square(outputs - y))    
optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate)         
training_op = optimizer.minimize(loss)                                          

init = tf.global_variables_initializer() 

Entrenarรก el modelo utilizando 1500 รฉpocas e imprimirรก la pรฉrdida cada 150 iteraciones. Una vez que se entrena el modelo, se evalรบa el modelo en el conjunto de prueba y se crea un objeto que contiene las predicciones como se muestra en el siguiente ejemplo de Red neuronal recurrente.

iteration = 1500 

with tf.Session() as sess:
    init.run()
    for iters in range(iteration):
        sess.run(training_op, feed_dict={X: X_batches, y: y_batches})
        if iters % 150 == 0:
            mse = loss.eval(feed_dict={X: X_batches, y: y_batches})
            print(iters, "\tMSE:", mse)
    
    y_pred = sess.run(outputs, feed_dict={X: X_test})
0 	MSE: 502893.34
150 	MSE: 13839.129
300 	MSE: 3964.835
450 	MSE: 2619.885
600 	MSE: 2418.772
750 	MSE: 2110.5923
900 	MSE: 1887.9644
1050 	MSE: 1747.1377
1200 	MSE: 1556.3398
1350 	MSE: 1384.6113

Por fin, en este tutorial de aprendizaje profundo de RNN, puede trazar el valor real de la serie con el valor previsto. Si su modelo estรก corregido, los valores predichos deben colocarse encima de los valores reales.

Como puede ver, el modelo tiene margen de mejora. Depende de usted cambiar los hiperparรกmetros, como las ventanas, el tamaรฑo del lote o la cantidad de neuronas recurrentes.

plt.title("Forecast vs Actual", fontsize=14)
plt.plot(pd.Series(np.ravel(y_test)), "bo", markersize=8, label="Actual", color='green')
plt.plot(pd.Series(np.ravel(y_pred)), "r.", markersize=8, label="Forecast", color='red')
plt.legend(loc="lower left")
plt.xlabel("Time")

plt.show()
Pronรณstico versus real

Pronรณstico versus real

Resumen

Una red neuronal recurrente es una arquitectura robusta para manejar series temporales o anรกlisis de texto. La salida del estado anterior es una retroalimentaciรณn para preservar la memoria de la red a lo largo del tiempo o de una secuencia de palabras.

En TensorFlow, puede utilizar los siguientes cรณdigos para entrenar una red neuronal recurrente de TensorFlow para series de tiempo:

Parรกmetros del modelo.

n_windows = 20   
n_input =  1
n_output = 1
size_train = 201

Definir el modelo

X = tf.placeholder(tf.float32, [None, n_windows, n_input])   
y = tf.placeholder(tf.float32, [None, n_windows, n_output])

basic_cell = tf.contrib.rnn.BasicRNNCell(num_units=r_neuron, activation=tf.nn.relu)   
rnn_output, states = tf.nn.dynamic_rnn(basic_cell, X, dtype=tf.float32)              

stacked_rnn_output = tf.reshape(rnn_output, [-1, r_neuron])          
stacked_outputs = tf.layers.dense(stacked_rnn_output, n_output)       
outputs = tf.reshape(stacked_outputs, [-1, n_windows, n_output])

Construir la optimizaciรณn

learning_rate = 0.001  
 
loss = tf.reduce_sum(tf.square(outputs - y))    
optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate)         
training_op = optimizer.minimize(loss)                                          

Entrenar a la modelo

init = tf.global_variables_initializer() 
iteration = 1500 

with tf.Session() as sess:
    init.run()
    for iters in range(iteration):
        sess.run(training_op, feed_dict={X: X_batches, y: y_batches})
        if iters % 150 == 0:
            mse = loss.eval(feed_dict={X: X_batches, y: y_batches})
            print(iters, "\tMSE:", mse)
    
    y_pred = sess.run(outputs, feed_dict={X: X_test})

Resumir este post con: