Crea tu primera red neuronal con TensorFlow desde Cero🧠🤖 ¡Identifica Operaciones Matemáticas!

Por Administrador

¡Hola, hola Omesitos! En este post encontrarás el código completo usado en el video: Crea tu primera red neuronal con TensorFlow desde Cero🧠🤖 ¡Identifica Operaciones Matemáticas!. Este programa te guiará paso a paso para construir un modelo que identifica operaciones matemáticas, comenzando con la preparación del dataset hasta realizar predicciones.

Si quieres la explicación del proceso con más detalle, puedes seguir el videotutorial relacionado aquí.

A continuación, te comparto el programa para que puedas ejecutarlo y experimentar con él. ¡Disfruta aprendiendo y explorando las redes neuronales!

👩‍🔬 ¡A crear el dataset!

import numpy as np
import pandas as pd
# Crear un rango de números para las tablas
numeros = np.arange(1, 101)

# Generar las tablas de sumar, restar, multiplicar y dividir
data = {
    "Num_1": np.repeat(numeros, len(numeros)),
    "Num_2": np.tile(numeros, len(numeros)),
    "addition": np.repeat(numeros, len(numeros)) + np.tile(numeros, len(numeros)),
    "subtraction": np.repeat(numeros, len(numeros)) - np.tile(numeros, len(numeros)),
    "multiplication": np.repeat(numeros, len(numeros)) * np.tile(numeros, len(numeros)),
    "division": np.round(np.repeat(numeros, len(numeros)) / np.tile(numeros, len(numeros)), 2)}

# Crear el DataFrame
df = pd.DataFrame(data)

# Transformar en una única columna de resultados y una de operaciones
df = pd.melt(df, id_vars=["Num_1", "Num_2"],
            value_vars=["addition", "subtraction", "multiplication", "division"],
            var_name="Operation", value_name="Result")

# Añadir etiquetas descriptivas a las operaciones
operation_labels = {
    "addition": 0,
    "subtraction": 1,
    "multiplication": 2,
    "division": 3}

# Agregar columna con etiquetas descriptivas
df["Operation_label"] = df["Operation"].map(operation_labels)
df.head()

🔍¡A explorar el dataset!

df["Operation"].value_counts()
df.describe()
df[df["Result"] == -99]

✂️ Dividir el dataset en entrenamiento y validación

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Verificar las dimensiones
print("X_train shape:", X_train.shape, " y_train shape:", y_train.shape)
print("X_test shape:", X_test.shape, " y_test shape:", y_test.shape)

🛠️ ¡A construir la arquitectura del modelo!

from tensorflow.keras import Sequential
from tensorflow.keras.layers import Input, Dense
# Crear modelo con Input
model = Sequential([
    Input(shape=(3,)),                 # Definir explícitamente la forma de entrada
    Dense(16, activation='relu'),      # Capa oculta 1
    Dense(16, activation='relu'),      # Capa oculta 2
    Dense(4, activation='softmax')     # Capa de salida (4 clases)
])
model.summary()

⚙️¡A compilar el modelo!

# Compilar modelo
model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

🏋️‍♂️ ¡A entrenar el modelo!

# Entrenar modelo
history = model.fit(X_train,
                    y_train,
                    epochs=50,
                    batch_size=32,
                    validation_data=(X_test, y_test))
history.history.keys()
import matplotlib.pyplot as plt

plt.style.use("ggplot")
plt.figure(figsize=(6, 4))
plt.plot(np.arange(0, len(history.history["loss"])), history.history["loss"], label="train_loss")
plt.plot(np.arange(0, len(history.history["loss"])), history.history["val_loss"], label="val_loss")
plt.title("Train and Test Loss")
plt.xlabel("Epoch #")
plt.ylabel("Loss")
plt.legend()
plt.show()
plt.style.use("ggplot")
plt.figure(figsize=(6, 4))
plt.plot(np.arange(0, len(history.history["accuracy"])), history.history["accuracy"], label="train_acc")
plt.plot(np.arange(0, len(history.history["val_accuracy"])), history.history["val_accuracy"], label="val_acc")
plt.title("Train and Test Accuracy")
plt.xlabel("Epoch #")
plt.ylabel("Accuracy")
plt.legend()
plt.show()
model.evaluate(X_train, y_train)
model.evaluate(X_test, y_test)

🤖 ¡A hacer predicciones con el modelo!

# Datos para predecir
new_data = np.array([
    [99, 5, 19.8],
    [10, 10, 0],
    [2, 2, 4],
    [1000, 2, 998],
    [-10, 2, -8]
])
# Predecir con el modelo
predictions = model.predict(new_data)
predictions = np.round(predictions, 2)
print(predictions)
# Convertir probabilidades a clases
predicted_classes = np.argmax(predictions, axis=1)
print(predicted_classes)
# Mapa de etiquetas a operaciones
operation_map = {
    0: "addition",
    1: "subtraction",
    2: "multiplication",
    3: "division"}

# Mostrar resultados
for i, (inputs, pred_class) in enumerate(zip(new_data, predicted_classes)):
    op = operation_map[pred_class]
    print(f"Para los números {inputs[:2]} con resultado {inputs[2]} -> {op}")