Transformación de datos en PyTorch

En PyTorch, la transformación de datos (Data Transformation) es un mecanismo para procesar los datos al cargarlos, convirtiendo los datos originales a un formato adecuado para el entrenamiento de modelos. Esto se realiza principalmente con las herramientas proporcionadas por torchvision.transforms.

La transformación de datos no solo permite realizar un preprocesamiento básico (como normalización, cambio de tamaño, etc.), sino que también ayuda en el aumento de datos (como recorte aleatorio, volteo, etc.), mejorando la capacidad de generalización del modelo.

¿Por qué se necesitan transformaciones de datos?

Preprocesamiento de datos:

  • Ajustar el formato, el tamaño y el rango de los datos para que sean adecuados como entrada del modelo.
  • Por ejemplo, las imágenes deben ajustarse a un tamaño fijo, en formato de tensor y normalizarse a [0, 1].

Aumento de datos:

  • Transformar los datos durante el entrenamiento para aumentar la diversidad.
  • Por ejemplo, mediante rotación, volteo y recorte aleatorios se aumentan las variantes de las muestras de datos, evitando el sobreajuste.

Flexibilidad:

  • Al definir una serie de operaciones de transformación, los datos pueden procesarse dinámicamente, simplificando la complejidad de la carga de datos.

En PyTorch, el módulo torchvision.transforms proporciona varias operaciones de transformación para el procesamiento de imágenes.

Operaciones básicas de transformación

Nombre de la función de transformaciónDescripciónEjemplo
transforms.ToTensor()Convierte imágenes PIL o arreglos NumPy a tensores de PyTorch y normaliza automáticamente los valores de píxeles a [0, 1].transform = transforms.ToTensor()
transforms.Normalize(mean, std)Estandariza las imágenes para que los datos tengan media cero y varianza unitaria.transform = transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
transforms.Resize(size)Ajusta el tamaño de la imagen para asegurar que las imágenes de entrada a la red tengan el mismo tamaño.transform = transforms.Resize((256, 256))
transforms.CenterCrop(size)Recorta un área del tamaño especificado desde el centro de la imagen.transform = transforms.CenterCrop(224)

1、ToTensor

Convierte imágenes PIL o arreglos NumPy a tensores de PyTorch.

También normaliza los valores de píxeles de [0, 255] a [0, 1].

from torchvision import transforms

transform = transforms.ToTensor()

2、Normalize

Estandariza los datos para que se ajusten a una media y desviación estándar específicas.

Se usa generalmente para datos de imagen, normalizando sus valores de píxeles a media cero y varianza unitaria.

transform = transforms.Normalize(mean=[0.5], std=[0.5])  # 归一化到 [-1, 1]

3、Resize

Ajusta el tamaño de la imagen.

transform = transforms.Resize((128, 128))  # 将图像调整为 128x128

4、CenterCrop

Recorta un área del tamaño especificado desde el centro de la imagen.

transform = transforms.CenterCrop(128)  # 裁剪 128x128 的区域

Operaciones de aumento de datos

Nombre de la función de transformaciónDescripciónEjemplo
transforms.RandomHorizontalFlip(p)Voltea la imagen horizontalmente de forma aleatoria.transform = transforms.RandomHorizontalFlip(p=0.5)
transforms.RandomRotation(degrees)Rota la imagen de forma aleatoria.transform = transforms.RandomRotation(degrees=45)
transforms.ColorJitter(brightness, contrast, saturation, hue)Ajusta el brillo, el contraste, la saturación y el tono de la imagen.transform = transforms.ColorJitter(brightness=0.2, contrast=0.2, saturation=0.2, hue=0.1)
transforms.RandomCrop(size)Recorta aleatoriamente un área del tamaño especificado.transform = transforms.RandomCrop(224)
transforms.RandomResizedCrop(size)Recorta la imagen aleatoriamente y la ajusta al tamaño especificado.transform = transforms.RandomResizedCrop(224)

1、RandomCrop

Recorta aleatoriamente un tamaño especificado de la imagen.

transform = transforms.RandomCrop(128)

2、RandomHorizontalFlip

Voltea la imagen horizontalmente con cierta probabilidad.

transform = transforms.RandomHorizontalFlip(p=0.5)  # 50% 概率翻转

3、RandomRotation

Rota un cierto ángulo de forma aleatoria.

transform = transforms.RandomRotation(degrees=30)  # 随机旋转 -30 到 +30 度

4、ColorJitter

Cambia aleatoriamente el brillo, el contraste, la saturación o el tono de la imagen.

transform = transforms.ColorJitter(brightness=0.5, contrast=0.5)

Transformaciones combinadas

Nombre de la función de transformaciónDescripciónEjemplo
transforms.Compose()Combina varias transformaciones y las aplica secuencialmente en orden.transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]), transforms.Resize((256, 256))])

Combina varias transformaciones mediante transforms.Compose.

transform = transforms.Compose([
    transforms.Resize((128, 128)),
    transforms.RandomHorizontalFlip(p=0.5),
    transforms.ToTensor(),
    transforms.Normalize(mean=[0.5], std=[0.5])
])

Transformaciones personalizadas

Si las funciones proporcionadas por transforms no satisfacen las necesidades, se pueden implementar clases o funciones personalizadas.

Ejemplo

class CustomTransform:
    def __call__(self, x):
        # Aquí se puede personalizar cualquier lógica de transformación
        return x * 2

transform = CustomTransform()

Ejemplo

Aplicar transformaciones a conjuntos de datos de imágenes

Cargar el conjunto de datos MNIST y aplicar transformaciones.

Ejemplo

from torchvision import datasets, transforms
from torch.utils.data import DataLoader

# Definir la transformación
transform = transforms.Compose([
    transforms.Resize((128, 128)),
    transforms.ToTensor(),
    transforms.Normalize(mean=[0.5], std=[0.5])
])

# Cargar el conjunto de datos
train_dataset = datasets.MNIST(root='./data', train=True, transform=transform, download=True)

# Usar DataLoader
train_loader = DataLoader(dataset=train_dataset, batch_size=32, shuffle=True)

# Ver los datos transformados
for images, labels in train_loader:
    print(Tamaño del tensor de la imagen:, images.size())  # [batch_size, 1, 128, 128]
    break

El resultado es:

图像张量大小: torch.Size([32, 1, 128, 128])

Visualizar el efecto de las transformaciones

El siguiente código muestra la comparación entre los datos originales y los datos transformados.

Ejemplo

import matplotlib.pyplot as plt
from torchvision import datasets
from torchvision import datasets, transforms


# Visualización de las imágenes originales y aumentadas
transform_augment = transforms.Compose([
    transforms.RandomHorizontalFlip(),
    transforms.RandomRotation(30),
    transforms.ToTensor()
])

# Cargar el conjunto de datos
dataset = datasets.MNIST(root='./data', train=True, download=True, transform=transform_augment)

# Mostrar imágenes
def show_images(dataset):
    fig, axs = plt.subplots(1, 5, figsize=(15, 5))
    for i in range(5):
        image, label = dataset[i]
        axs[i].imshow(image.squeeze(0), cmap='gray')  # Convertir (1, H, W) a (H, W)
        axs[i].set_title(f"Label: {label}")
        axs[i].axis('off')
    plt.show()

show_images(dataset)

Se muestra a continuación:

Otras extensiones