¿Cuál es el ejemplo de código más simple para redes neuronales recurrentes (RNN) en TensorFlow?

Cuando supe por primera vez sobre RNN, leí la publicación de blog de Andrej Karpathy. [1] No es exactamente un tutorial, pero la publicación ofrece algunas ideas de alto nivel sobre lo que puede hacer un RNN y cómo funciona junto con algún código.

Escribió el código [2] que lo acompaña en Python y NumPy y lo puso en Github. El código no usa TensorFlow, pero si recién comienza a jugar con el código RNN, es un buen lugar para comenzar. Puede ejecutarlo prácticamente tal cual y producir algunos buenos resultados. Es un modelo simple de vainilla para RNN.

También puede ver la conferencia de Stanford [3] de Karpathy donde habla específicamente sobre ese fragmento de código. Presenta el modelo recurrente de vainilla a partir de las 7:42 en adelante, y luego habla sobre el código a partir de las 13:40 en adelante.

Sin embargo, en términos de TensorFlow, si ya está familiarizado con RNN, debería poder encontrar un puerto del código vanilla char-RNN en algún lugar de Github haciendo una búsqueda rápida. Encontré esto: Vanilla Char-RNN usando TensorFlow, que se ve muy comparable.

Notas al pie

[1] La efectividad irracional de las redes neuronales recurrentes

[2] Modelo de lenguaje de nivel de caracteres mínimo con una red neuronal recurrente de vainilla, en Python / numpy

[3] CS231n Invierno 2016: Conferencia 10: Redes neuronales recurrentes, subtitulado de imágenes, LSTM

Hay muchos blogs y repositorios de github donde puede encontrar código de muestra para todo tipo de arquitecturas de redes neuronales, incluidos los RNN. Aquí hay un enlace a uno de estos repositorios introductorios populares: aymericdamien / TensorFlow-examples. En particular, eche un vistazo a este cuaderno: aymericdamien / TensorFlow-examples.

Al igual que Charles, estoy de acuerdo en que primero debe comprender cómo funcionan los RNN a un alto nivel y, de hecho, recomendarle recursos similares para comenzar. La publicación de Andrej Kaparthy y la publicación de blog de Christopher Olah sobre LSTM son geniales.

Desafortunadamente, todavía falta la documentación de TensorFlow ya que la biblioteca es bastante nueva y crece rápidamente , probablemente más rápido de lo que tienen tiempo para hacer tutoriales decentes. Las páginas del tutorial RNN y Seq2Seq, por ejemplo, le dan una idea muy básica de lo que están haciendo, pero para comprender completamente lo que está sucediendo, tendrá que jugar con su código fuente (por eso le recomiendo que comprenda conceptos de antemano).

Esto será un poco desalentador, teniendo en cuenta que sus “tutoriales” son cientos de líneas de código en un solo archivo. Simplemente leer el código no es suficiente: intente implementar una versión más simple usted mismo, tal vez un modelo de lenguaje a nivel de caracteres como Kaparthy con cualquier buena información que pueda tener en sus manos. Así me familiaricé. TensorFlow tiene una curva de aprendizaje y se trata más de aprender haciendo. Te sentirás cómodo después de jugar con él.

En cuanto a su pregunta, aquí hay un código para el gráfico de un modelo de lenguaje simple a nivel de caracteres. Convierta sus personajes en identificaciones únicas y cree secuencias con un ‘time_steps’ de longitud fija para alimentar su modelo. La tarea de este modelo es simplemente predecir el siguiente carácter dado el historial de los que ha visto antes, y el código aquí es completamente funcional, excepto por ese tipo de preprocesamiento.

secuencia = tf.placeholder (
tf.int32, nombre = ‘entradas’,
forma = [BATCH_SIZE, TIME_STEPS])
entradas = secuencia [:,: -1]
etiquetas = secuencia [:, 1:]

# Convierte cada ID de personaje en una representación vectorial
embedding_matrix = tf.get_variable (
’embedding_matrix’, [ALPHABET_SIZE, NUM_HIDDEN],
initializer = tf.random_uniform_initializer (minval = -1., maxval = 1.))
embeddings = tf.nn.embedding_lookup (embedding_matrix, entradas)

# RNN – consejo profesional: use un LSB o GRU `Block`, son más rápidos.
rnn_cell = tf.contrib.rnn.MultiRNNCell ([
tf.contrib.rnn.LSTMBlockCell (NUM_HIDDEN) para _ en rango (NUM_LAYERS)
])
rnn_out, _ = tf.nn.dynamic_rnn (rnn_cell, incrustaciones, dtype = tf.float32)

# Convertir de nuevo al tamaño del alfabeto para predicciones
logits = tf.layers.dense (rnn_out, ALPHABET_SIZE, nombre = ‘denso’)
output = tf.argmax (logits, axis = 2, name = ‘output’)

# Función de pérdida para minimizar
pérdida = tf.reduce_mean (tf.nn.sparse_softmax_cross_entropy_with_logits (
logits = logits, etiquetas = etiquetas, nombre = ‘pérdida’
))

# Puede hacer esto en una línea, pero siempre debe recortar el
# gradientes a una norma máxima para evitar que exploten.
# `MAX_GRAD_NORM = 5.` debería funcionar bien.
tvars = tf.trainable_variables ()
graduados, _ = tf.clip_by_global_norm (
tf.gradients (pérdida, tvars), MAX_GRAD_NORM
)
# Puede usar cualquier optimizador que desee, pero Adam funciona bien en la práctica
optimizador = tf.train.AdamOptimizer (LEARNING_RATE)
train_op = optimizer.apply_gradients (zip (graduados, tvars))

# Ahora para ejecutar esto, solo necesitas hacer algo como
# sess.run (train_op, feed_dict = {secuencia: la_secuencia})
# donde `the_sequence` es una matriz 2D de forma [BATCH_SIZE, TIME_STEPS]

Hola, aquí hay una implementación simple de
Carácter RNN y Palabra RNN
Shivakishore14 / simple-word-and-char-rnn-tensorflow
Con una breve explicación CodeFreaksBlog.

Te sugiero que sigas los pasos dados en Redes neuronales recurrentes | TensorFlow.

Además, el código está disponible en tensorflow / models.

Puede ver la diferencia entre LSTM y la celda RNN normal leyendo esto:

importar tensorflow como tf
de tensorflow.contrib import rnn

x = tf.constant ([[1]], dtype = tf.float32)
x2 = tf.constant ([[0]], dtype = tf.float32)
rnn_cell = rnn.BasicRNNCell (2)
lstm_cell = rnn.BasicLSTMCell (2)
salidas1, estados1 = rnn.static_rnn (rnn_cell, [x, x2, x2, x2, x2, x2, x2, x2, x2], dtype = tf.float32)
salidas2, estados2 = rnn.static_rnn (lstm_cell, [x, x2, x2, x2, x2, x2, x2, x2, x2], dtype = tf.float32)
init = tf.global_variables_initializer ()
con tf.Session () como sess:
sess.run (init)
outouts_print1 = sess.run (salidas1)
states_print1 = sess.run (states1)
print (outouts_print1)
outouts_print2 = sess.run (salidas2)
states_print2 = sess.run (states2)
print (outouts_print2)