O mellor cerebro artificial
- Duración:
- 120 min
- Agrupamento:
- 2
Estrutura do reto
- Fase 1: Configuración → Cada equipo debe axustar os parámetros da súa rede: capas ocultas, número de neuronas, activacións, optimizador, taxa de aprendizaxe e épocas.
- Fase 2: Adestramento → A rede neuronal entrena con MNIST, e visualiza as curvas de aprendizaxe para comprobar se mellora.
- Fase 3: Predición → Cada equipo testea a súa rede coas imaxes separadas para proba, e mide cantas predicións son correctas.
- Fase 4: Xestión e Axustes → Debedes crear a función de xestión da rede e probala. Se a rede falla moito, reconfigúrase ou readéstrase modificando os parámetros.
- Fase 5: Comparación final → Comparar as porcentaxes de acerto entre os equipos e descubrir a mellor rede da clase!
Lembra:A IA está para axudarche, pregúntalle!
Librerías e clase de modelo preciso para este reto
No caderno de colab donde desenroles este reto, debes poñer arriba de todo para que sexa accesible para todas as celdas:
- Librerías necesarias
- Esta estrutura de rede neuronal personalizada en PyTorch, construída para recoñecer imaxes. Basicamente, toma números, pasaos por varias capas de neuronas, e devolve unha predición.
Fase 1: Configurar a rede neuronal
Cada equipo elixirá os parámetros da súa rede.
Esta é a función que configura a rede neuronal.
Fase 2: Crear e adestrar a rede neuronal
Cada equipo terá a súa rede personalizada, escollerá os parámetros de adestramento e verá como mellora ao longo do tempo.
Esta é a función que adestra a rede neuronal.
Fase 3: Probar o modelo coas imaxes separadas ao principio
Cada equipo subirá imaxes (zip - 11406 B) e medirá cantas predicións son correctas.
Esta é a función que proba a rede neuronal.
Fase 4: Función de xestión. Axustes e melloras
Tarefa: Xestión dunha Rede Neuronal
Obxectivo: Implementar a función programa_principal() para xestionar unha rede neuronal que realiza tres tarefas principais: configurar a rede, adestrala e probala.
Funcións auxiliares xa implementadas:
- configurar_rede() → Configura os parámetros da rede.
- adestrar_modelo() → Adestra a rede neuronal cos datos.
- proba_modelo() → Proba a rede neuronal con imaxes.
✍️ Tarefa:
Implementa a función programa_principal() seguindo estes requisitos:
- Debe executar configurar_rede(), adestrar_modelo() e proba_modelo() nunha orde lóxica.
- Debe incluír un menú interactivo que permita ao usuario modificar a configuración, re-adestrar ou probar novas imaxes.
- Debe validar as opcións introducidas polo usuario.
Exemplo de saída esperada:
Executando o programa principal...
Configuración da rede neuronal
Número de capas ocultas (Exemplo: 1, 2, 3,etc): 3
Número de neuronas por capa oculta (Exemplo: 128, 256, 512): 128
Escolle a función de activación
1 - ReLU (Axuda en redes profundas)
2 - Sigmoid (Útil para clasificación simple)
3 - Tanh (Axuda en valores negativos e positivos)
Elixe 1-ReLU, 2-Sigmoid, 3-Tanh: 3
Escolle o optimizador
1 - SGD (Simple pero lento)
2 - Adam (Máis rápido, mellora en problemas complexos)
3 - RMSprop (Ideal para datos ruidosos)
Elixe 1-SGD, 2-Adam, 3-RMSprop: 3
Configuración da rede neuronal:
+-------------------+---------------------------------------+
| Parámetro | Valor |
+===================+=============+
| Capas ocultas | 3 |
+-------------------+---------------------------------------+
| Neuronas por capa | 128 |
+-------------------+---------------------------------------+
| Activación | Tanh() |
+-------------------+---------------------------------------+
| Optimizador | <class 'torch.optim.rmsprop.RMSprop'> |
+-------------------+---------------------------------------+
A REDE NEURONAL ESTÁ CONFIGURADA E LISTA PARA ADESTRARSE!
Escolle os parámetros da aprendizaxe
Taxa de aprendizaxe (Exemplo: 0.01, 0.001): 0.01
Número de épocas de adestramento (Exemplo: 5, 10, 20): 5
Tamaño dos lotes (Exemplo: 16, 32, 64): 64
Iniciando o adestramento do modelo...
Época 1: Perda = 0.5029, Precisión = 0.8623
Época 2: Perda = 0.1925, Precisión = 0.9350
Época 3: Perda = 0.0898, Precisión = 0.9481
Época 4: Perda = 0.1407, Precisión = 0.9538
Época 5: Perda = 0.0248, Precisión = 0.9571

O adestramento completouse con éxito!
O MODELO ESTÁ LISTO PARA REALIZAR PREDICIÓNS
Modo de predición activado! Sube unha imaxe e o modelo fará unha predición.
Cando queiras rematar verás a taxa de acerto.
mnist_digit_7_9.png(image/png) - 279 bytes, last modified: 5/6/2025 - 100% done
Saving mnist_digit_7_9.png to mnist_digit_7_9 (1).png
Predicións do modelo:
7 (100.00%)
9 (0.00%)
1 (0.00%)
Acertou o modelo? (s/n): s
Queres subir outra imaxe? (s/n): s
mnist_digit_5_20.png(image/png) - 285 bytes, last modified: 5/6/2025 - 100% done
Saving mnist_digit_5_20.png to mnist_digit_5_20 (1).png
Predicións do modelo:
5 (97.18%)
3 (1.09%)
8 (0.94%)
Acertou o modelo? (s/n): s
Queres subir outra imaxe? (s/n): s
mnist_digit_3_18.png(image/png) - 355 bytes, last modified: 5/6/2025 - 100% done
Saving mnist_digit_3_18.png to mnist_digit_3_18 (1).png
Predicións do modelo:
3 (92.73%)
9 (6.65%)
5 (0.25%)
Acertou o modelo? (s/n): s
Queres subir outra imaxe? (s/n): n
TAXA DE ACERTO DO MODELO: 100.00%
Modo de predición finalizado!
QUE QUERES FACER AGORA?
1 - Modificar a configuración e re-adestrar
2 - Modificar os parámetros de adestramento e re-adestrar
3 - Volver a probar o modelo con novas imaxes
4 - Saír
Elixe unha opción (1/2/3/4): 4
Programa finalizado! Grazas por usar a rede neuronal.
Entrega:
Escribe a función programa_principal() seguindo os requisitos anteriores e integrala coas funcións auxiliares. Asegúrate de que a interacción coa usuaria sexa clara e eficiente.
Código Python: Librerías para reto 12
# Bibliotecas principais import torch import torch.nn as nn import torch.optim as optim import torchvision import torchvision.transforms as transforms import torch.utils.data import torch.nn.functional as F import numpy as np
# Manipulación de imaxes from PIL import Image, ImageOps from google.colab import files # Para subir imaxes en Colab # Visualización import matplotlib.pyplot as plt from tabulate import tabulate # Para presentar os parámetros da rede en táboas
Código Python: Estrutura de rede para reto 12
class CustomNN(nn.Module):
def __init__(self, num_capas, tam_oculta, activacion):
super(CustomNN, self).__init__()
# Mapear activación correctamente
activaciones_map = {"ReLU": nn.ReLU(), "Sigmoid": nn.Sigmoid(), "Tanh": nn.Tanh()}
self.activacion = activaciones_map.get(str(activacion), nn.ReLU()) # Converte `activacion` nun string se fose necesario
# Capas da rede
self.capas = nn.ModuleList()
self.capas.append(nn.Linear(28*28, tam_oculta))
for _ in range(num_capas - 1):
self.capas.append(nn.Linear(tam_oculta, tam_oculta))
self.saida = nn.Linear(tam_oculta, 10) # Última capa para clasificación en 10 clases
# Se queremos engadir capa dropout
#self.dropout = nn.Dropout(p=0.5) # P = 0.2 significa que o 20% das neuronas se desactivan aleatoriamente. Evita sobreaxuste.
def forward(self, x):
x = x.view(x.size(0), -1) # Remodelar entrada
for capa in self.capas:
x = self.activacion(capa(x))
# x = self.dropout(x) # Aplicar dropout despois de cada activación se apreciamos sobreaxuste
x = self.saida(x) # Última capa sen activación
return x
Código Python: Función que configura a rede neuronal cos parámetros escollidos
# FUNCIÓN PARA CONFIGURAR A REDE
def configurar_rede():
global num_capas, tam_oculta, activacion, optimizador_func
print("\nConfiguración da rede neuronal\n")
num_capas = int(input("\nNúmero de capas ocultas (Exemplo: 1, 2, 3,etc): "))
tam_oculta = int(input("\nNúmero de neuronas por capa oculta (Exemplo: 128, 256, 512): "))
print("\nEscolle a función de activación")
print("1 - ReLU (Axuda en redes profundas)")
print("2 - Sigmoid (Útil para clasificación simple)")
print("3 - Tanh (Axuda en valores negativos e positivos)")
activacion_map = {1: nn.ReLU(), 2: nn.Sigmoid(), 3: nn.Tanh()}
activacion_opc = int(input("Elixe 1-ReLU, 2-Sigmoid, 3-Tanh: "))
activacion = activacion_map.get(activacion_opc, nn.ReLU())
print("\nEscolle o optimizador")
print("1 - SGD (Simple pero lento)")
print("2 - Adam (Máis rápido, mellora en problemas complexos)")
print("3 - RMSprop (Ideal para datos ruidosos)")
optimizador_map = {1: optim.SGD, 2: optim.Adam, 3: optim.RMSprop}
optimizador_opc = int(input("Elixe 1-SGD, 2-Adam, 3-RMSprop: "))
optimizador_func = optimizador_map.get(optimizador_opc, optim.Adam)
# Crear a táboa cos valores seleccionados
datos_rede = [
["Capas ocultas", num_capas],
["Neuronas por capa", tam_oculta],
["Activación", activacion],
["Optimizador", optimizador_func]
]
print("\nConfiguración da rede neuronal:")
print(tabulate(datos_rede, headers=["Parámetro", "Valor"], tablefmt="grid"))
# Mensaxe final indicando que está lista
print("\n\nA REDE NEURONAL ESTÁ CONFIGURADA E LISTA PARA ADESTRARSE!")
Código Python: Función que adestra a rede neuronal cos parámetros escollidos e grafica o proceso
# FUNCIÓN PARA ADESTRAR A REDE
def adestrar_modelo():
global model, losses, accuracies, taxa_aprendizaxe, num_epocas, batch_size
print("\nEscolle os parámetros da aprendizaxe")
taxa_aprendizaxe = float(input("Taxa de aprendizaxe (Exemplo: 0.01, 0.001): "))
num_epocas = int(input("Número de épocas de adestramento (Exemplo: 5, 10, 20): "))
batch_size = int(input("Tamaño dos lotes (Exemplo: 16, 32, 64): "))
print("\nIniciando o adestramento do modelo...")
# Crear o modelo cos parámetros configurados
model = CustomNN(num_capas, tam_oculta, activacion)
optimizer = optimizador_func(model.parameters(), lr=taxa_aprendizaxe)
criterion = nn.CrossEntropyLoss()
# Cargar o conxunto de datos MNIST
transform = transforms.Compose([transforms.ToTensor()])
dataset = torchvision.datasets.MNIST(root="./data", train=True, transform=transform, download=True)
loader = torch.utils.data.DataLoader(dataset, batch_size=batch_size, shuffle=True)
losses = []
accuracies = []
# Adestrar a rede neuronal
for epoch in range(num_epocas):
correct = 0
total = 0
for images, labels in loader:
optimizer.zero_grad()
outputs = model(images)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
losses.append(loss.item())
# Calcular precisión
predictions = torch.argmax(outputs, dim=1)
correct += (predictions == labels).sum().item()
total += labels.size(0)
accuracy = correct / total
accuracies.append(accuracy)
print(f"Época {epoch+1}: Perda = {loss.item():.4f}, Precisión = {accuracy:.4f}")
# Mostrar gráficas da aprendizaxe
plt.figure(figsize=(10, 4))
plt.subplot(1, 2, 1)
plt.plot(losses, label="Perda", color="red")
plt.title("Curva de perda")
plt.xlabel("Iteracións")
plt.ylabel("Perda")
plt.legend()
plt.subplot(1, 2, 2)
plt.plot(accuracies, label="Precisión", color="blue")
plt.title("Curva de precisión")
plt.xlabel("Épocas")
plt.ylabel("Precisión")
plt.legend()
plt.show()
# Mensaxe final
print("\nO adestramento completouse con éxito! \nO MODELO ESTÁ LISTO PARA REALIZAR PREDICIÓNS")
Código Python: Función que proba a rede neuronal coas imaxes subidas
#FUNCIÓN PARA PROBAR A REDE
def proba_modelo():
global total_predicions , total_acertos
total_predicions = 0 # Inicializa a variable
total_acertos = 0
print("\nModo de predición activado! Sube unha imaxe e o modelo fará unha predición.")
print("Cando queiras rematar verás a taxa de acerto.\n")
while True:
# Subir imaxe
uploaded = files.upload()
filename = list(uploaded.keys())[0]
#Preparamos o formato da imaxe e a convertimos nun tensor que a rede "comprenda"
image = Image.open(filename).convert("L")
image_tensor = torch.tensor(np.array(image) / 255.0).unsqueeze(0).unsqueeze(0).float()
# Predición do modelo
outputs = model(image_tensor)
probabilities = torch.nn.functional.softmax(outputs, dim=1)
top3 = torch.topk(probabilities, 3)
total_predicions += 1 # Rexistrar cantas imaxes se analizaron
print("\nPredicións do modelo:\n")
for i in range(3):
print(f" {top3.indices[0][i].item()} ({top3.values[0][i].item()*100:.2f}%)")
resposta = input("\n Acertou o modelo? (s/n): ").strip().lower()
if resposta == "s":
total_acertos += 1 # Rexistrar os acertos
continuar = input("\nQueres subir outra imaxe? (s/n): ").strip().lower()
if continuar == "n":
break
# Mostra a taxa de acerto ao finalizar
if total_predicions > 0:
print(f"\nTAXA DE ACERTO DO MODELO: {total_acertos/total_predicions*100:.2f}%")
else:
print("\nNon se subiron imaxes para predicir.")
print("\n Modo de predición finalizado! ")
Librerías e clase de modelo preciso para este reto
Código Python:Librerías para este reto
# Bibliotecas principais
import torch
import torch.nn as nn
import torch.optim as optim
import torchvision
import torchvision.transforms as transforms
import torch.utils.data
import torch.nn.functional as F
import numpy as np
# Manipulación de imaxes
from PIL import Image, ImageOps
from google.colab import files # Para subir imaxes en Colab
# Visualización
import matplotlib.pyplot as plt
from tabulate import tabulate # Para presentar os parámetros da rede en táboas
Código Python: Estrutura da rede neuronal con Pytorch
class CustomNN(nn.Module):
def __init__(self, num_capas, tam_oculta, activacion):
super(CustomNN, self).__init__()
# Mapear activación correctamente
activaciones_map = {"ReLU": nn.ReLU(), "Sigmoid": nn.Sigmoid(), "Tanh": nn.Tanh()}
self.activacion = activaciones_map.get(str(activacion), nn.ReLU()) # Converte `activacion` nun string se fose necesario
# Capas da rede
self.capas = nn.ModuleList()
self.capas.append(nn.Linear(28*28, tam_oculta))
for _ in range(num_capas - 1):
self.capas.append(nn.Linear(tam_oculta, tam_oculta))
self.saida = nn.Linear(tam_oculta, 10) # Última capa para clasificación en 10 clases
# Se queremos engadir capa dropout
#self.dropout = nn.Dropout(p=0.5) # P = 0.2 significa que o 20% das neuronas se desactivan aleatoriamente. Evita sobreaxuste.
def forward(self, x):
x = x.view(x.size(0), -1) # Remodelar entrada
for capa in self.capas:
x = self.activacion(capa(x))
# x = self.dropout(x) # Aplicar dropout despois de cada activación se apreciamos sobreaxuste
x = self.saida(x) # Última capa sen activación
return x
Fase 1: Configurar a rede neuronal
Código Python: Función para configurar a rede cos parámetros escollidos
# FUNCIÓN PARA CONFIGURAR A REDE
def configurar_rede():
global num_capas, tam_oculta, activacion, optimizador_func
print("\nConfiguración da rede neuronal\n")
num_capas = int(input("\nNúmero de capas ocultas (Exemplo: 1, 2, 3,etc): "))
tam_oculta = int(input("\nNúmero de neuronas por capa oculta (Exemplo: 128, 256, 512): "))
print("\nEscolle a función de activación")
print("1 - ReLU (Axuda en redes profundas)")
print("2 - Sigmoid (Útil para clasificación simple)")
print("3 - Tanh (Axuda en valores negativos e positivos)")
activacion_map = {1: nn.ReLU(), 2: nn.Sigmoid(), 3: nn.Tanh()}
activacion_opc = int(input("Elixe 1-ReLU, 2-Sigmoid, 3-Tanh: "))
activacion = activacion_map.get(activacion_opc, nn.ReLU())
print("\nEscolle o optimizador")
print("1 - SGD (Simple pero lento)")
print("2 - Adam (Máis rápido, mellora en problemas complexos)")
print("3 - RMSprop (Ideal para datos ruidosos)")
optimizador_map = {1: optim.SGD, 2: optim.Adam, 3: optim.RMSprop}
optimizador_opc = int(input("Elixe 1-SGD, 2-Adam, 3-RMSprop: "))
optimizador_func = optimizador_map.get(optimizador_opc, optim.Adam)
# Crear a táboa cos valores seleccionados
datos_rede = [
["Capas ocultas", num_capas],
["Neuronas por capa", tam_oculta],
["Activación", activacion],
["Optimizador", optimizador_func]
]
print("\nConfiguración da rede neuronal:")
print(tabulate(datos_rede, headers=["Parámetro", "Valor"], tablefmt="grid"))
# Mensaxe final indicando que está lista
print("\n\nA REDE NEURONAL ESTÁ CONFIGURADA E LISTA PARA ADESTRARSE!")
Fase 2: Adestrar e a rede neuronal
Código Python: Función para adestrar a rede cos parámetros escollidos
# FUNCIÓN PARA ADESTRAR A REDE
def adestrar_modelo():
global model, losses, accuracies, taxa_aprendizaxe, num_epocas, batch_size
print("\nEscolle os parámetros da aprendizaxe")
taxa_aprendizaxe = float(input("Taxa de aprendizaxe (Exemplo: 0.01, 0.001): "))
num_epocas = int(input("Número de épocas de adestramento (Exemplo: 5, 10, 20): "))
batch_size = int(input("Tamaño dos lotes (Exemplo: 16, 32, 64): "))
print("\nIniciando o adestramento do modelo...")
# Crear o modelo cos parámetros configurados
model = CustomNN(num_capas, tam_oculta, activacion)
optimizer = optimizador_func(model.parameters(), lr=taxa_aprendizaxe)
criterion = nn.CrossEntropyLoss()
# Cargar o conxunto de datos MNIST
transform = transforms.Compose([transforms.ToTensor()])
dataset = torchvision.datasets.MNIST(root="./data", train=True, transform=transform, download=True)
loader = torch.utils.data.DataLoader(dataset, batch_size=batch_size, shuffle=True)
losses = []
accuracies = []
# Adestrar a rede neuronal
for epoch in range(num_epocas):
correct = 0
total = 0
for images, labels in loader:
optimizer.zero_grad()
outputs = model(images)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
losses.append(loss.item())
# Calcular precisión
predictions = torch.argmax(outputs, dim=1)
correct += (predictions == labels).sum().item()
total += labels.size(0)
accuracy = correct / total
accuracies.append(accuracy)
print(f"Época {epoch+1}: Perda = {loss.item():.4f}, Precisión = {accuracy:.4f}")
# Mostrar gráficas da aprendizaxe
plt.figure(figsize=(10, 4))
plt.subplot(1, 2, 1)
plt.plot(losses, label="Perda", color="red")
plt.title("Curva de perda")
plt.xlabel("Iteracións")
plt.ylabel("Perda")
plt.legend()
plt.subplot(1, 2, 2)
plt.plot(accuracies, label="Precisión", color="blue")
plt.title("Curva de precisión")
plt.xlabel("Épocas")
plt.ylabel("Precisión")
plt.legend()
plt.show()
# Mensaxe final
print("\nO adestramento completouse con éxito! \nO MODELO ESTÁ LISTO PARA REALIZAR PREDICIÓNS")
Fase 3: Probar o modelo coas imaxes separadas ao principio
Código Python: Función para probar o modelo
#FUNCIÓN PARA PROBAR A REDE
def proba_modelo():
global total_predicions , total_acertos
total_predicions = 0 # Inicializa a variable
total_acertos = 0
print("\nModo de predición activado! Sube unha imaxe e o modelo fará unha predición.")
print("Cando queiras rematar verás a taxa de acerto.\n")
while True:
# Subir imaxe
uploaded = files.upload()
filename = list(uploaded.keys())[0]
#Preparamos o formato da imaxe e a convertimos nun tensor que a rede "comprenda"
image = Image.open(filename).convert("L")
image_tensor = torch.tensor(np.array(image) / 255.0).unsqueeze(0).unsqueeze(0).float()
# Predición do modelo
outputs = model(image_tensor)
probabilities = torch.nn.functional.softmax(outputs, dim=1)
top3 = torch.topk(probabilities, 3)
total_predicions += 1 # Rexistrar cantas imaxes se analizaron
print("\nPredicións do modelo:\n")
for i in range(3):
print(f" {top3.indices[0][i].item()} ({top3.values[0][i].item()*100:.2f}%)")
resposta = input("\n Acertou o modelo? (s/n): ").strip().lower()
if resposta == "s":
total_acertos += 1 # Rexistrar os acertos
continuar = input("\nQueres subir outra imaxe? (s/n): ").strip().lower()
if continuar == "n":
break
# Mostra a taxa de acerto ao finalizar
if total_predicions > 0:
print(f"\nTAXA DE ACERTO DO MODELO: {total_acertos/total_predicions*100:.2f}%")
else:
print("\nNon se subiron imaxes para predicir.")
print("\n Modo de predición finalizado! ")
Fase 4: Función de xestión. Axustes e melloras
Código Python: Función para xestionar a rede
def programa_principal():
while True:
print("\nExecutando o programa principal...")
# Paso 1: Configurar a rede neuronal
configurar_rede()
# Paso 2: Adestrar o modelo
adestrar_modelo()
# Paso 3: Probar o modelo con imaxes
proba_modelo()
while True: # Bucle para asegurarse de que a opción sexa válida
print("\n\nQUE QUERES FACER AGORA?")
print("1 - Modificar a configuración e re-adestrar")
print("2 - Modificar os parámetros de adestramento e re-adestrar")
print("3 - Volver a probar o modelo con novas imaxes")
print("4 - Saír")
opcion = input("Elixe unha opción (1/2/3/4): ").strip()
if opcion == "1":
configurar_rede()
adestrar_modelo()
proba_modelo()
elif opcion == "2":
adestrar_modelo()
proba_modelo()
elif opcion == "3":
proba_modelo()
elif opcion == "4":
print("\nPrograma finalizado! Grazas por usar a rede neuronal.")
return # Saír do programa completamente
else:
print("\n⚠ Opción non válida. Escolle un número entre 1 e 4.") # Volve pedir a opción
# Executar o programa principal
programa_principal()