Crea tu primera red neuronal con TensorFlow desde Cero🧠🤖 ¡Identifica Operaciones Matemáticas!
¡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}")