Simple RNN

Ejemplo canónico de una RNN para una tarea más básica, como la predicción de la próxima palabra en una secuencia de texto. Este tipo de tarea ilustra claramente cómo las RNN pueden manejar datos secuenciales.

Importamos los módulos necesarios

import tensorflow as tf
import numpy as np

Definimos los datos de entrenamiento, que es una cadena de texto.

# Datos de entrenamiento
text = "Hola, ¿cómo estás? Soy una red neuronal recurrente simple. Hago predicción de secuencias de palabras."

Obtenemos todas las palabras de nuestro texto

words = text.split()

Definimos dos diccionarios de la siguiente manera

  • Diccionario 1: {"index": "word"}

  • Diccionario 1: {"word": "index"}

que mapean cada palabra única a un índice y viceversa. Esto es útil para convertir palabras en números enteros y viceversa.

# Tokenizacion
word_to_idx = {word: idx for idx, word in enumerate(words)}
idx_to_word = {idx: word for idx, word in enumerate(words)}

Preparación de Datos de Entrada y Salida

seq_length = 3 
# Puedes cambir por otro numero, por ejemplo 5.

= []
= []
for i in range(len(words) - seq_length):
    seq_in = words[i:+ seq_length]
    seq_out = words[+ seq_length]
    X.append([word_to_idx[word] for word in seq_in])
    y.append(word_to_idx[seq_out])

= np.array(X)
= np.array(y)

Establecemos seq_length en 3, lo que significa que vamos a tomar secuencias de 3 caracteres como entrada y tratar de predecir el siguiente carácter.

Creamos dos listas, X e y, donde X contendrá las secuencias de entrada codificadas como números enteros e y contendrá las palabras de destino codificados de la misma manera. Luego, convertimos estas listas en matrices NumPy para facilitar el procesamiento.

Creación del Modelo RNN

model = tf.keras.Sequential([
    tf.keras.layers.Embedding(len(words), 10, input_length=seq_length),
    tf.keras.layers.SimpleRNN(32, activation='tanh', input_shape=(seq_length, 10)),
    tf.keras.layers.Dense(len(words), activation='softmax')
])

Creamos el modelo de RNN utilizando el módulo de Keras de TensorFlow. El modelo consta de dos capas:

  • Una capa Embedding que se utiliza para mapear las palabras en vectores de números reales.

  • Una capa SimpleRNN con 3232 unidades, que toma una secuencia de longitud seq_length y utiliza la función de activación tangente hiperbólica (tanh).

  • Una capa Dense con un número de unidades igual al número de caracteres únicos en el texto, y utiliza la función de activación softmax.

Compilación del Modelo

model.compile(loss='sparse_categorical_crossentropy', optimizer='adam')

Definimos la función de pérdida como sparse_categorical_crossentropy, que se utiliza para problemas de clasificación de varias clases. Y configuramos el optimizador adam para ajustar los pesos durante el entrenamiento.

Entrenamiento del Modelo

model.fit(X, y, epochs=10)

Entrenamos el modelo RNN utilizando los datos de entrada X y las etiquetas y durante 1010 épocas. Cambie el parámetro de épocas y note el cambio los valores de loss y accuraccy

El modelo aprenderá a predecir el siguiente carácter en una secuencia basándose en los patrones en los datos de entrenamiento.

Generación de Texto

Generamos texto utilizando el modelo entrenado.

# Generación de secuencia de palabras
seed_text = "Soy una red"
seed_words = seed_text.split()
generated_words = list(seed_words)

for _ in range(2):
    x = np.array([[word_to_idx[word] for word in seed_words]])
    y_pred = model.predict(x)
    next_word_idx = np.argmax(y_pred)
    next_word = idx_to_word[next_word_idx]
    generated_words.append(next_word)
    seed_words = seed_words[1:] + [next_word]

generated_text = ' '.join(generated_words)
print(generated_text)

Comenzamos con una "semilla" (seed_text) y, en un bucle, predecimos la siguiente palabra en función de la semilla.

Luego, agregamos el carácter predicho a la semilla y repetimos el proceso 22 veces para generar un texto con dos palabras al texto original.

Remark.

El modelo utiliza las probabilidades de salida de la capa softmax para hacer predicciones.

La longitud de la variable seed_text debe de ser igual a la definida en la variable seq_lengthpara evitar errores.

Last updated