Función PyTorch torch.nn.MSELoss
Manual de referencia de PyTorch torch.nn
torch.nn.MSELossEs la función de pérdida de error cuadrático medio en PyTorch.
Calcula la media de los cuadrados de las diferencias entre los valores predichos y los valores objetivo, comúnmente utilizada en tareas de regresión.
Definición de la función
torch.nn.MSELoss(reduction='mean')
Descripción de parámetros:
reduction(str): Modo de agregación de pérdida. Opciones'mean'、'sum'、'none'. El valor predeterminado es'mean'。
Principio matemático
Fórmula de pérdida MSE:
MSE = (1/n) * Σ(y_pred - y_true)²
Ejemplos de uso
Ejemplo 1: Uso básico
Calcular la pérdida de regresión:
Ejemplo
import torch
import torch.nn as nn
# Crear la pérdida MSE
criterion = nn.MSELoss()
# Valores predichos y valores reales
predictions = torch.tensor([3.0, 4.0, 5.0])
targets = torch.tensor([2.8, 4.2, 4.9])
# Calcular la pérdida
loss = criterion(predictions, targets)
print("Valores predichos:", predictions.tolist())
print("Valores objetivo:", targets.tolist())
print("Pérdida MSE:", loss.item())
# Verificación manual
manual_mse = ((predictions - targets) ** 2).mean()
print("Cálculo manual:", manual_mse.item())
import torch.nn as nn
# Crear la pérdida MSE
criterion = nn.MSELoss()
# Valores predichos y valores reales
predictions = torch.tensor([3.0, 4.0, 5.0])
targets = torch.tensor([2.8, 4.2, 4.9])
# Calcular la pérdida
loss = criterion(predictions, targets)
print("Valores predichos:", predictions.tolist())
print("Valores objetivo:", targets.tolist())
print("Pérdida MSE:", loss.item())
# Verificación manual
manual_mse = ((predictions - targets) ** 2).mean()
print("Cálculo manual:", manual_mse.item())
Ejemplo 2: Entrenamiento de regresión completo
Flujo de entrenamiento para tareas de regresión:
Ejemplo
import torch
import torch.nn as nn
import torch.optim as optim
# Modelo de regresión simple
class RegressionNet(nn.Module):
def __init__(self):
super(RegressionNet, self).__init__()
self.fc = nn.Linear(10, 1)
def forward(self, x):
return self.fc(x)
model = RegressionNet()
criterion = nn.MSELoss()
optimizer = optim.Adam(model.parameters(), lr=0.01)
# Datos de entrenamiento
X = torch.randn(100, 10)
y = torch.randn(100, 1)
# Pasos de entrenamiento
model.train()
optimizer.zero_grad()
predictions = model(X)
loss = criterion(predictions, y)
loss.backward()
optimizer.step()
print("Pérdida de entrenamiento:", loss.item())
import torch.nn as nn
import torch.optim as optim
# Modelo de regresión simple
class RegressionNet(nn.Module):
def __init__(self):
super(RegressionNet, self).__init__()
self.fc = nn.Linear(10, 1)
def forward(self, x):
return self.fc(x)
model = RegressionNet()
criterion = nn.MSELoss()
optimizer = optim.Adam(model.parameters(), lr=0.01)
# Datos de entrenamiento
X = torch.randn(100, 10)
y = torch.randn(100, 1)
# Pasos de entrenamiento
model.train()
optimizer.zero_grad()
predictions = model(X)
loss = criterion(predictions, y)
loss.backward()
optimizer.step()
print("Pérdida de entrenamiento:", loss.item())
Ejemplo 3: Parámetro reduction
Diferentes modos de agregación:
Ejemplo
import torch
import torch.nn as nn
pred = torch.tensor([3.0, 4.0, 5.0, 6.0])
target = torch.tensor([3.5, 3.8, 5.2, 5.5])
# mean: pérdida promedio
loss_mean = nn.MSELoss(reduction='mean')(pred, target)
# sum: pérdida total
loss_sum = nn.MSELoss(reduction='sum')(pred, target)
# none: sin agregación
loss_none = nn.MSELoss(reduction='none')(pred, target)
print("Mean:", loss_mean.item())
print("Sum:", loss_sum.item())
print("None:", loss_none.tolist())
import torch.nn as nn
pred = torch.tensor([3.0, 4.0, 5.0, 6.0])
target = torch.tensor([3.5, 3.8, 5.2, 5.5])
# mean: pérdida promedio
loss_mean = nn.MSELoss(reduction='mean')(pred, target)
# sum: pérdida total
loss_sum = nn.MSELoss(reduction='sum')(pred, target)
# none: sin agregación
loss_none = nn.MSELoss(reduction='none')(pred, target)
print("Mean:", loss_mean.item())
print("Sum:", loss_sum.item())
print("None:", loss_none.tolist())
Ejemplo 4: Manejo de salidas multidimensionales
Regresión multidimensional:
Ejemplo
import torch
import torch.nn as nn
# Salida multidimensional
pred = torch.randn(4, 3) # batch=4, 3 salidas
target = torch.randn(4, 3)
criterion = nn.MSELoss()
loss = criterion(pred, target)
print("Forma de la predicción:", pred.shape)
print("Forma del objetivo:", target.shape)
print("Pérdida MSE:", loss.item())
import torch.nn as nn
# Salida multidimensional
pred = torch.randn(4, 3) # batch=4, 3 salidas
target = torch.randn(4, 3)
criterion = nn.MSELoss()
loss = criterion(pred, target)
print("Forma de la predicción:", pred.shape)
print("Forma del objetivo:", target.shape)
print("Pérdida MSE:", loss.item())
Preguntas frecuentes
Q1: ¿Cuál es mejor, MSE o MAE?
- MSE: sensible a valores atípicos, gradiente estable
- MAE (L1): robusto a valores atípicos, gradiente inestable
Q2: ¿Se puede usar MSE si la salida tiene valores negativos?
Sí, MSE no limita el rango de salida.
Q3: ¿Qué pérdida se usa para tareas de clasificación?
Para tareas de clasificación se usa CrossEntropyLoss.
Escenarios de uso
nn.MSELossLos principales escenarios de aplicación incluyen:
- Tareas de regresión: predicción de precios de viviendas, estimación numérica
- Predicción de valores continuos: seguimiento de objetos
- Modelos generativos: algunas pérdidas de VAE, GAN
Otras extensiones