Phase 08: Generative AI

GANs condicionales y Pix2Pix

La primera gran desbloqueación de 2014-2017 fue controlar lo que hace un GAN. adjunta una etiqueta, o una imagen, o una frase. Pix2Pix hizo la versión de imagen y todavía supera todos los modelos genéricos de texto a imagen en tareas estrechas de imagen a imagen.

Type: Build

Languages: Python

Prerequisites: Phase 8 · 03 (GANs), Phase 4 · 06 (U-Net), Phase 3 · 07 (CNNs)

Time: ~75 minutes

El problema

Un GAN incondicional muestra caras arbitrarias. Útil para una demostración, inútil en la producción. Quieres: mapear un boceto a una foto, mapear un mapa a una foto aérea, mapear una escena diurna a la noche, colorizar una imagen a escala de gris. En todas estas, se te da una imagen de entradaxy debe emitiryHay muchas razones plausibles.yporxEl error medio cuadrado los aplanará en masaje.

GAN condicional (Mirza & Osindero, 2014) añade una condición ccomo una entrada para ambos Gy D. Pix2Pix (Isola et al., 2017) se especializó en esto: condición es una imagen de entrada completa, generador es una U-Net, discriminador es un clasificador basado en parches (PatchGAN), y pérdida es adversarial + L1.

El concepto

!Pix2Pix: U-Net generator, PatchGAN discriminator

Conditional G. G(x, z) → yEn Pix2Pix,zse desprende dentro de G (no hay ruido de entrada Isola encontró que el ruido explícito fue ignorado).

Conditional D. D(x, y) → [0, 1]. La entrada es el pair (condición, salida). Esta es la diferencia clave: D debe juzgar si yes consistente con x, no sólo siyParece real.

U-Net generator.Encoder-decodificador con conexiones de salto a través del cuello de botella. Es crítico para tareas donde la entrada y salida comparten una estructura de bajo nivel (bordañas, silueta). Sin los saltos, los detalles de alta frecuencia desaparecen.

PatchGAN discriminator.En lugar de emitir una única puntuación real/falsa, D emitirá unaN×NLa red de la red donde cada célula juzga un campo receptivo de ~70×70 píxeles. promedio. Esta es una suposición de campo aleatorio de Markov: el realismo es local.

Loss.

loss_G = -log D(x, G(x)) + λ · ||y - G(x)||_1
loss_D = -log D(x, y) - log (1 - D(x, G(x)))

El término L1 estabiliza el entrenamiento y empuja a G hacia el objetivo conocido.λ = 100fue el default de Pix2Pix.

CycleGAN cuando no tienes pares

Pix2Pix necesita emparejados (x, y)Los datos. CycleGAN (Zhu et al., 2017) reduce este requisito al costo de una pérdida adicional: la pérdida de consistencia del ciclo .G: X → Yy F: Y → XEntrenadlos así .F(G(x)) ≈ xy G(F(y)) ≈ yEsto te permite traducir caballos a cebras, verano a invierno, sin ejemplos emparejados.

En 2026, la imagen a imagen sin pareja se realiza principalmente a través de la difusión (ControlNet, IP-Adapter) en lugar de CycleGAN, pero la idea de coherencia de ciclo sobrevive en casi todos los papeles de adaptación de dominio sin pareja.

Construye el mismo

code/main.pyImplementa una pequeña GAN condicional en los datos 1D.ces una etiqueta de clase (0 o 1). La tarea: producir una muestra de la distribución condicional para la clase dada.

Paso 1: añadir la condición a las entradas G y D

pythondef G(z, c, params):
    return mlp(concat([z, one_hot(c)]), params)

def D(x, c, params):
    return mlp(concat([x, one_hot(c)]), params)

El codificación de un solo punto es la forma más simple. Los modelos más grandes utilizan embebedidos aprendidos, modulación FiLM o atención cruzada.

Paso 2: tren condicional

pythonfor step in range(steps):
    x, c = sample_real_conditional()
    noise = sample_noise()
    update_D(x_real=x, x_fake=G(noise, c), c=c)
    update_G(noise, c)

El generador debe coincidir con la distribución real de la condición dada, no con la marginal.

Paso 3: verificar la salida por clase

pythonfor c in [0, 1]:
    samples = [G(noise, c) for noise in batch]
    mean_c = mean(samples)
    assert_near(mean_c, real_mean_for_class_c)

Las trampas

  • Condition ignored.G aprende a marginar, D nunca penaliza porque la señal de condición es débil.
  • L1 weight too low.G se deriva a resultados reales arbitrarios, no fieles.
  • L1 weight too high.G produce resultados borrosos porque L1 sigue siendo una norma de L_p.
  • Ground-truth leakage in D.Concatenato (x, y)como entrada D, no sólo ySin este D no se puede comprobar la consistencia.
  • Mode collapse per class.Cada clase puede colapsar de forma independiente.

Usalo

2026 estado de las tareas de imagen a imagen:

TaskBest approach
Sketch → photo, same domain, paired dataPix2Pix / Pix2PixHD (still fast, still sharp)
Sketch → photo, unpairedControlNet with a Scribble conditioning model
Semantic seg → photoSPADE / GauGAN2 or SD + ControlNet-Seg
Style transferDiffusion with IP-Adapter or LoRA; GAN methods are legacy
Depth → photoControlNet-Depth over Stable Diffusion
Super-resolutionReal-ESRGAN (GAN), ESRGAN-Plus, or SD-Upscale (diffusion)
ColorizationColTran, diffusion-based colorizers, or Pix2Pix-color
Daytime → nighttime, seasons, weatherCycleGAN or ControlNet-based

Pix2Pix sigue siendo la herramienta correcta cuando (a) tienes miles de ejemplos emparejados, (b) la tarea es estrecha y repetible, y (c) necesitas una inferencia rápida. En tareas genéricas de dominio abierto, la difusión gana.

Envío

Salva .outputs/skill-img2img-chooser.md. La habilidad toma una descripción de tarea, la disponibilidad de datos (pareados vs. sin parejas, muestras N) y el presupuesto de latencia/calidad, luego las salidas: enfoque (Pix2Pix, CycleGAN, variante de ControlNet, SDXL + IP-Adapter), requisitos de datos de capacitación, costo de inferencia y protocolo de evaluación (LPIPS, FID, específico de tarea).

Los ejercicios

  1. Easy.Modificarcode/main.pyConfirmar G todavía maps el ruido de cada clase al modo correcto.
  2. Medium.Reemplazar L1 con una pérdida de estilo perceptivo en el entorno 1-D (por ejemplo, un pequeño D congelado que actúa como extractor de características). ¿Cambia la nitidez de la distribución condicional?
  3. Hard.Esbozar un CycleGAN en la configuración 1-D: dos distribuciones, dos generadores, pérdida de ciclo. Muestre que aprende a mapear entre ellos sin datos emparejados.

Términos clave

TermWhat people sayWhat it actually means
Conditional GAN"GAN with labels"G(z, c), D(x, c). Both networks see the condition.
Pix2Pix"Image-to-image GAN"Paired cGAN with U-Net G and PatchGAN D + L1 loss.
U-Net"Encoder-decoder with skips"Symmetric conv network; skips preserve high-freq.
PatchGAN"Local-realism classifier"D outputs per-patch score instead of global score.
CycleGAN"Unpaired image translation"Two G's + cycle-consistency loss; no paired data.
SPADE"GauGAN"Normalizes intermediate activations with the semantic map; segmentation-to-image.
FiLM"Feature-wise linear modulation"Per-feature affine transform from the condition; cheap conditioning.

Nota de producción: Pix2Pix como línea de base limitada a la latencia

Cuando se ha emparejado datos y una tarea estrecha (bozo → renderizado, mapa semántico → foto, día → noche), la inferencia de una sola toma de Pix2Pix supera la difusión por un orden de magnitud en la latencia.

PathStepsTypical latency at 512² on a single L4
Pix2Pix (U-Net forward)1~30 ms
SD-Inpaint or SD-Img2Img20~1.2 s
SDXL-Turbo Img2Img1-4~0.15-0.35 s
ControlNet + SDXL base20-30~3-5 s

Pix2Pix gana en el rendimiento en lotes estáticos (cada solicitud es la misma FLOPs). La difusión gana en la calidad y generalización.

Leer más

This free lesson is part of the AI Engineering from Scratch curriculum. Read the full explanation, run the lesson code, and verify the result in the interactive reader or from the repository source.

Browse the complete course catalog or open this lesson on GitHub.