!De la geometría a la IA! Cómo predecir el volumen de un cilindro con Tensorflow 🧠🤖

Por Administrador

¡Hola, hola Omesitos! En este post encontrarás el código completo usado en el video: !De la geometría a la IA! Cómo predecir el volumen de un cilindro con Tensorflow 🧠🤖. Este programa te guiará paso a paso para construir un modelo que permite predecir el volumen de un cilindro, 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
# Generar el dataset
np.random.seed(42)
n_samples = 20000

# Valores aleatorios para el radio y la altura
r = np.random.uniform(1, 10, n_samples)
h = np.random.uniform(1, 20, n_samples)

# Calcular el volumen del cilindro
V = np.pi * (r**2) * h

# Crear el dataset de entrada (X) y salida (y)
X = np.vstack([r, h]).T
y = V.reshape(-1, 1)
print(X)
print(y)

🔍¡A explorar el dataset!

import matplotlib.pyplot as plt
plt.style.use("ggplot")
# Crear gráficos
plt.figure(figsize=(10, 4))

# Gráfico del radio
plt.subplot(1, 3, 1)
plt.hist(r, bins=20, color='plum', edgecolor='black')
plt.title('Distribución del Radio', fontsize=10)
plt.xlabel('Radio', fontsize=10)
plt.ylabel('Frecuencia', fontsize=10)

# Gráfico de la altura
plt.subplot(1, 3, 2)
plt.hist(h, bins=20, color='mediumpurple', edgecolor='black')
plt.title('Distribución de la Altura', fontsize=10)
plt.xlabel('Altura', fontsize=10)
plt.ylabel('Frecuencia', fontsize=10)

# Gráfico del volumen
plt.subplot(1, 3, 3)
plt.hist(V, bins=20, color='lightblue', edgecolor='black')
plt.title('Distribución del Volumen', fontsize=10)
plt.xlabel('Volumen', fontsize=10)
plt.ylabel('Frecuencia', fontsize=10)

# Mostrar los gráficos
plt.tight_layout()
plt.show()
df = pd.DataFrame(X, columns=['radio', 'altura'])
df['volumen'] = y
df.head()
df.describe()

⚖️ ¡A preprocesar los datos!

from sklearn.preprocessing import StandardScaler
# Escalar los datos
scaler_X = StandardScaler()
scaler_y = StandardScaler()

X_scaled = scaler_X.fit_transform(X)
y_scaled = scaler_y.fit_transform(y)

✂️ 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_scaled, y_scaled, 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=(2,)),                 # Definir explícitamente la forma de entrada
    Dense(16, activation='relu'),      # Capa oculta 1
    Dense(16, activation='relu'),      # Capa oculta 2
    Dense(1)
])
model.summary()

⚙️¡A compilar el modelo!

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

🏋️‍♂️ ¡A entrenar el modelo!

# Entrenar modelo
history = model.fit(X_train,
                    y_train,
                    epochs=30,
                    batch_size=32,
                    validation_data=(X_test, y_test))

📐 ¡A evaluar el modelo!

history.history.keys()
import matplotlib.pyplot as plt

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["mae"])), history.history["mae"], label="train_mae")
plt.plot(np.arange(0, len(history.history["val_mae"])), history.history["val_mae"], label="val_mae")
plt.title("Train and Test Mae")
plt.xlabel("Epoch #")
plt.ylabel("Mae")
plt.legend()
plt.show()
model.evaluate(X_train, y_train)
model.evaluate(X_test, y_test)

🤖 ¡A hacer predicciones con el modelo!

# Hacer predicciones con el modelo
X_new = np.array([[5.43, 10.32],
                  [7.5, 15.09],
                  [3, 4.4]])
X_new_scaled = scaler_X.transform(X_new)

# Predecir volúmenes escalados
y_pred_scaled = model.predict(X_new_scaled)
#print(y_pred_scaled)

# Revertir el escalado de las predicciones
y_pred = scaler_y.inverse_transform(y_pred_scaled)
print(y_pred)
# Calcular el volumen real a comparar
y_true = np.pi * X_new[:, 0]**2 * X_new[:, 1]

# Mostrar las predicciones y los valores reales
print("PREDICCIONES VS VALORES REALES")
for i, (pred, real) in enumerate(zip(y_pred, y_true)):
    print(f"Entrada {i +1}: Radio={X_new[i, 0]}, Altura={X_new[i, 1]}")
    print(f"Predicción {i+1}: {pred[0]:.2f} - Valor Real: {real:.2f}")
    print()