PyTorch es una de las bibliotecas de aprendizaje profundo (deep learning) más utilizadas en la actualidad. Creada por Facebook's AI Research Lab (FAIR), ha ganado popularidad gracias a su facilidad de uso, flexibilidad y soporte dinámico de grafos computacionales. Es ampliamente adoptada por investigadores, desarrolladores y científicos de datos para construir y entrenar modelos de machine learning y deep learning.
PyTorch es un framework de machine learning basado en Python que proporciona soporte para realizar cálculos numéricos y construir redes neuronales con gran flexibilidad. Se utiliza tanto en investigación como en producción debido a su compatibilidad con CPUs y GPUs, facilitando el desarrollo de aplicaciones en diversos campos como la visión por computadora, el procesamiento del lenguaje natural y la robótica.
torchvision
, torchaudio
y torchtext
, que simplifican el trabajo con datos específicos, como imágenes, audio y texto.
Los tensores son el núcleo de PyTorch. Se pueden considerar como una generalización de los arreglos (arrays) y matrices, y son el equivalente en PyTorch a los arrays de NumPy. Sin embargo, los tensores de PyTorch pueden ejecutarse en GPUs, lo que los hace mucho más eficientes para el procesamiento de datos a gran escala.
import torch
# Crear un tensor a partir de una lista
tensor = torch.tensor([1, 2, 3, 4])
print(tensor)
# Tensor de ceros
zeros = torch.zeros(3, 3)
print(zeros)
# Tensor de unos
ones = torch.ones(2, 4)
print(ones)
# Tensor aleatorio
random_tensor = torch.rand(5, 2)
print(random_tensor)
Las operaciones con tensores en PyTorch son similares a las que se realizan en NumPy, pero incluyen características avanzadas como la posibilidad de ejecutarse en GPU.
# Suma de tensores
a = torch.tensor([1, 2, 3])
b = torch.tensor([4, 5, 6])
suma = a + b
print(suma)
# Multiplicación de tensores
multiplicacion = a * b
print(multiplicacion)
# Producto punto
dot_product = torch.dot(a, b)
print(dot_product)
Una de las características más poderosas de PyTorch es autograd, su sistema de diferenciación automática. Este sistema calcula automáticamente los gradientes de las funciones de pérdida con respecto a los parámetros del modelo, lo que facilita la optimización del modelo.
Para utilizar autograd
, es necesario habilitar el seguimiento de los gradientes en los tensores. Esto se hace con el parámetro requires_grad=True
.
# Crear un tensor con requires_grad=True
x = torch.tensor([2.0], requires_grad=True)
# Definir una función simple
y = x ** 2 + 3 * x + 2
# Realizar la diferenciación
y.backward()
# El gradiente de x en y = x^2 + 3x + 2 es 2x + 3
print(x.grad) # Resultado: tensor([7.])
En PyTorch, las redes neuronales se construyen utilizando la clase torch.nn.Module
. PyTorch proporciona todos los componentes necesarios para construir arquitecturas de deep learning como capas, funciones de activación, pérdida, optimización, etc.
Aquí creamos un ejemplo simple de una red neuronal totalmente conectada (fully connected) para resolver un problema de clasificación binaria.
import torch
import torch.nn as nn
import torch.optim as optim
# Definir el modelo
class SimpleNN(nn.Module):
def __init__(self):
super(SimpleNN, self).__init__()
self.fc1 = nn.Linear(10, 5)
self.fc2 = nn.Linear(5, 1)
def forward(self, x):
x = torch.relu(self.fc1(x))
x = torch.sigmoid(self.fc2(x))
return x
# Crear una instancia del modelo
model = SimpleNN()
# Definir una función de pérdida y un optimizador
criterion = nn.BCELoss() # Binary Cross-Entropy
optimizer = optim.SGD(model.parameters(), lr=0.01)
# Datos ficticios
inputs = torch.randn(8, 10)
targets = torch.randint(0, 2, (8, 1)).float()
# Forward pass: computar predicciones
outputs = model(inputs)
# Calcular la pérdida
loss = criterion(outputs, targets)
# Backward pass: calcular los gradientes
loss.backward()
# Actualizar los parámetros
optimizer.step()
print(f"Loss: {loss.item()}")
Entrenar redes neuronales en CPU puede ser lento para modelos complejos o grandes conjuntos de datos. PyTorch facilita el entrenamiento en GPU con el uso de torch.cuda
. Para mover un tensor o modelo a GPU, solo necesitas llamarlo con .to(device)
donde device
puede ser 'cuda'
para una GPU o 'cpu'
para la CPU.
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
# Crear un tensor en GPU
x = torch.randn(5, 5).to(device)
print(x)
model.to(device)
inputs = inputs.to(device)
targets = targets.to(device)
# El resto del código de entrenamiento permanece igual
outputs = model(inputs)
loss = criterion(outputs, targets)
loss.backward()
optimizer.step()
PyTorch y TensorFlow son las dos principales bibliotecas de deep learning. Ambas tienen ventajas y desventajas dependiendo del caso de uso.
En la actualidad, muchos investigadores prefieren PyTorch debido a su simplicidad, mientras que TensorFlow sigue siendo una opción común en producción debido a su madurez y herramientas adicionales como TensorFlow Extended (TFX).
PyTorch es una herramienta poderosa para la creación de modelos de deep learning. Su flexibilidad, facilidad de uso y soporte para GPU lo han convertido en una opción muy popular entre los investigadores y desarrolladores. A lo largo de este artículo, hemos explorado los conceptos básicos de PyTorch, desde la creación de tensores hasta la construcción de redes neuronales simples y su entrenamiento en GPU.
Con su comunidad en crecimiento y constante desarrollo de nuevas características, PyTorch es una excelente opción para quienes desean adentrarse en el mundo del aprendizaje profundo y construir modelos eficientes y escalables.
Jorge García
Fullstack developer