Tensores, formas y lotes de datos

2 min

Objetivo: leer las dimensiones de un tensor y prevenir la mayoría de los errores de forma. Requisito previo: NumPy elemental.

Un tensor es un arreglo multidimensional homogéneo. Un escalar tiene cero ejes, un vector un eje, una matriz dos ejes. El rango no es el número de elementos: es el número de ejes.

DatoForma habitual
Tabla densa(batch, features)
Imágenes PyTorch(batch, channels, height, width)
Texto tokenizado(batch, sequence_length)
Logits multiclase(batch, classes)
python
import torch

x = torch.randn(32, 3, 224, 224)
print(x.shape, x.dtype, x.device)
assert x.ndim == 4

Batch y mini-batch

El batch agrupa varios ejemplos procesados en paralelo. Un mini-batch de 32 imágenes produce una estimación del gradiente menos exacta que el conjunto completo, pero mucho menos costosa. Esta pequeña cantidad de ruido puede incluso ayudar a la generalización.

Tipo y dispositivo

Los pesos suelen estar en float32. Las etiquetas que espera CrossEntropyLoss son enteros torch.long. Todos los datos de una operación deben encontrarse en el mismo dispositivo: CPU, CUDA u otro acelerador.

python
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
x = x.to(device=device, dtype=torch.float32)

Disciplina de formas

En cada capa, escribe la forma esperada antes que el código. Para una capa densa Linear(128, 10), el último eje de entrada debe medir 128. Utiliza reshape con prudencia y prefiere flatten(start_dim=1) para preservar el eje del batch.

Trampas

  • Confundir NHWC y NCHW.
  • Eliminar accidentalmente el eje batch con squeeze().
  • Enviar el modelo a la GPU pero dejar los datos en la CPU.
  • Pasar etiquetas float32 a una pérdida que espera índices de clase.

Comprobación rápida

¿Cuál es la forma de 64 imágenes RGB de 32×32 en PyTorch? ¿Qué eje interpreta una capa densa como dimensión de entrada?

Respuestas

(64, 3, 32, 32). La capa densa utiliza el último eje.

Actividad de dominio — Auditoría de formas

Parte de X.shape = (32, 3, 64, 64). Hazlo atravesar una convolución que produzca 16 canales, una reducción espacial a la mitad, un pooling global y una cabeza de 7 clases. Escribe cada forma y tres aserciones Python. Éxito: el eje del lote sigue siendo 32 y la salida vale (32, 7).

Contrato de formas de un lote de imágenes

Lectura: el eje B atraviesa toda la red; solo las dimensiones de representación se transforman. Antes del entrenamiento, comprueba explícitamente X.ndim, el orden de los canales y la concordancia entre logits.shape[0] e y.shape[0]. La trampa principal es una permutación silenciosa de los ejes: el código puede ejecutarse mientras aprende una estructura que no tiene ningún sentido.