Crear una Red Neuronal que sea capaz de inventar la fórmula de pasar horas a minutos usando Python y Tensorflow

Tiempo de lectura: 3 minutos

Hoy os voy a enseñar cómo crear una pequeña red neuronal capaz de predecir la fórmula de pasar horas a minutos.

Para realizar esta Inteligencia Artificial, vamos a utilizar TensorFlow, una librería creada por Google que nos facilitara. Para instalarla ponemos:

python3 -m pip install tensorflow

Ahora creamos un archivo nuevo que lo llamamos velocidad.py

Vamos a empezar a añadir las dependencias:

import tensorflow as tf
import numpy as np

Ahora creamos unos datos de ejemplo de entrenamiento. No son los mejores datos de entrenamiento, pero para el ejemplo, valen.

# datos de entrenamiento horas y minutos (resultado), entrenamiento supervisado
horas = np.array([1.0, 2.0, 3.0, 4.0, 4.5, 5.0, 10.0, 23.0, 15.0, 24.0, 1.5, 1.2,
                  3.3, 5.3, 100.0, 12.3, 3.4], dtype=float)
minutos = np.array([60.0, 120.0, 180.0, 240.0, 270.0, 300.0, 600.0, 1380.0, 900.0, 1440.0, 90.0, 72.0,
                   198.0, 318.0, 6000.0, 738.0, 204.0], dtype=float)

Se crean dos arrays, uno con las horas y otro con la equivalencia en minutos. Al realizarse un entrenamiento supervisado, se va a entrenar el sistema, dando unos datos de entrada (horas) y los datos del resultado esperado (minutos).

Si queremos mejorar la Red Neuronal, tendremos que añadir más datos, cuantos más datos se añadan mejor.

Ahora vamos a crear el modelo para aprendizaje.

# Crea el modelo, usa 0.1 como tasa de aprendizaje y la función de pérdida es minimos cuadrados
modelo.compile(
    optimizer=tf.keras.optimizers.Adam(0.1),
    loss='mean_squared_error'
)

Primero añadimos el optimizador Adam con incremento de 0.1 (incrementa los índices de los nodos 0.1).

Además, incluimos como función de pérdida mínimos cuadrados.

Ahora tendremos que entrenar a nuestra Inteligencia Artificial.

# entrena el modelo
print("Entrenando el modelo...")
modelo_entrenado = modelo.fit(horas, minutos, epochs=1000, verbose=False)
print("Modelo entrenado OK")

Aquí indicamos que realice 1000 iteraciones sobre cada valor y que no nos imprima el log (verbose=False)

Una vez entrenado podemos predecir un valor.

En este caso vamos a predecir el valor de 9.0 horas:

# hacer una predicción
print("¿Cuántos minutos son 9 horas?")
resultado = modelo.predict([9.0])
print("9 horas son " + str(resultado) + " minutos")

Todo el código completo queda de la siguiente forma:

# Red neuronal que transorma horas y minutos a segundos
import tensorflow as tf
import numpy as np

# datos de entrenamiento
horas = np.array([1.0, 2.0, 3.0, 4.0, 4.5, 5.0, 10.0, 23.0, 15.0, 24.0, 1.5, 1.2,
                  3.3, 5.3, 100.0, 12.3, 3.4], dtype=float)
minutos = np.array([60.0, 120.0, 180.0, 240.0, 270.0, 300.0, 600.0, 1380.0, 900.0, 1440.0, 90.0, 72.0,
                   198.0, 318.0, 6000.0, 738.0, 204.0], dtype=float)

# Crea dos neuronas: una para la capa de entrada y otra para la capa de salida
capa = tf.keras.layers.Dense(units=1, input_shape=[1])
modelo = tf.keras.Sequential([capa])

# Crea el modelo, usa 0.1 como tasa de aprendizaje y la función de pérdida es minimos cuadrados
modelo.compile(
    optimizer=tf.keras.optimizers.Adam(0.1),
    loss='mean_squared_error'
)

# entrena el modelo
print("Entrenando el modelo...")
modelo_entrenado = modelo.fit(horas, minutos, epochs=1000, verbose=False)
print("Modelo entrenado OK")

# hacer una predicción
print("¿Cuántos minutos son 9 horas?")
resultado = modelo.predict([9.0])
print("9 horas son " + str(resultado) + " minutos")

Al ejecutarlo consigue predecir lo siguiente:

Nuestra Red Neuronal ha predicho que 9 horas son 551.87854 minutos, pero como sabemos en realidad son 540 minutos. Se acerca a la solución, pero esto demuestra que necesita más datos de entrenamiento.

Los datos de entrenamiento es la parte más importante de una red de inteligencia artificial, tendremos que buscar unos datos fiables y que además sea en gran cantidad para poder lograr resultados óptimos.

Deja un comentario