Hasta aquí nos concentramos principalmente en construir modelos, entrenarlos, evaluarlos y aplicarlos a tareas como clasificación, detección y segmentación. Pero todavía falta una pregunta muy importante: ¿por qué el modelo tomó cierta decisión?
En muchos casos, una predicción correcta no es suficiente. Queremos entender qué regiones de la imagen influyeron en la salida del sistema, si el modelo realmente está mirando el objeto correcto o si se apoya en pistas espurias del fondo.
En este tema introduciremos una de las técnicas más conocidas de interpretabilidad visual para CNN: Grad-CAM. La idea es obtener mapas de calor que nos ayuden a ver qué zonas de la imagen fueron más relevantes para una predicción determinada.
La interpretabilidad no es solo una curiosidad académica. Resulta útil por varias razones:
Si un modelo acierta, pero lo hace por razones equivocadas, ese problema puede permanecer oculto si solo miramos accuracy o pérdida.
Las CNN profundas suelen comportarse como sistemas muy potentes, pero difíciles de interpretar directamente. Podemos ver sus entradas y salidas, pero no siempre es obvio qué regiones visuales o qué patrones internos explican una decisión particular.
Grad-CAM no resuelve mágicamente toda esa opacidad, pero ofrece una ventana muy valiosa hacia la atención espacial del modelo.
Grad-CAM significa Gradient-weighted Class Activation Mapping. Es una técnica que usa gradientes y activaciones de una capa convolucional para construir un mapa de calor asociado a una clase específica.
Ese mapa de calor destaca regiones de la imagen que influyeron más en la predicción de esa clase.
La intuición es la siguiente:
Al combinar ambas cosas, podemos estimar qué regiones espaciales del mapa de características fueron más relevantes para la decisión del modelo.
Grad-CAM suele aplicarse sobre una capa convolucional relativamente profunda porque allí las activaciones ya codifican patrones de alto nivel, pero todavía conservan cierta estructura espacial.
Si fuéramos demasiado al principio de la red, tendríamos patrones muy locales y poco semánticos. Si fuéramos demasiado al final, quizá ya habríamos perdido detalle espacial útil.
El resultado típico es un mapa de calor superpuesto sobre la imagen original. Las regiones más intensas indican mayor contribución a la clase analizada.
Esto no significa “certeza absoluta” ni una segmentación exacta del objeto. Es una señal de relevancia espacial aproximada, no una máscara perfecta.
Grad-CAM puede ser útil para investigar preguntas como:
Grad-CAM es muy valioso, pero no debe interpretarse como si revelara toda la “explicación causal” del modelo. Es una herramienta de interpretabilidad aproximada.
Puede orientar el análisis, ayudar a detectar problemas y aportar intuición, pero no reemplaza una evaluación rigurosa ni constituye una prueba perfecta del razonamiento interno de la red.
De forma simplificada, Grad-CAM sigue estos pasos:
No hace falta memorizar cada detalle matemático aquí. Lo importante es entender la idea: usar gradientes para ponderar la importancia de mapas de características.
Los gradientes indican cuánto influye un cambio en cierta activación sobre la puntuación de la clase elegida. Si un canal tiene gradientes altos, significa que fue importante para esa predicción.
Grad-CAM usa justamente esa información para decidir qué mapas de activación deben pesar más en el mapa final.
Las activaciones de la capa convolucional describen dónde aparecen ciertos patrones visuales. Por sí solas no dicen qué clase las necesita más. Los gradientes aportan esa conexión con la predicción específica.
La combinación entre activaciones y gradientes es lo que da sentido a Grad-CAM.
En la formulación habitual de Grad-CAM se aplica una ReLU al mapa resultante para quedarse con las contribuciones positivas hacia la clase de interés. La intuición es centrarse en regiones que empujan la predicción en esa dirección, en lugar de mezclar también evidencia negativa.
Una vez obtenido el mapa, suele reescalarse al tamaño de la imagen y superponerse como un mapa de calor semitransparente. Esto hace la interpretación mucho más intuitiva, porque permite comparar directamente la atención del modelo con la estructura visual de la escena.
Imaginemos una imagen con un perro sobre césped. El clasificador predice “perro”. Si el Grad-CAM resalta principalmente la silueta del animal, eso da cierta tranquilidad. Si en cambio activa sobre todo el pasto o un rincón del fondo, puede indicar que el modelo está usando pistas accidentales.
Este tipo de análisis es especialmente útil para detectar atajos visuales indeseados.
Grad-CAM suele ser muy útil cuando:
Existen técnicas anteriores como CAM, pero Grad-CAM resultó especialmente influyente porque es más flexible y puede aplicarse a una variedad más amplia de arquitecturas basadas en gradientes, sin exigir exactamente la misma estructura final del modelo.
En PyTorch, implementar Grad-CAM implica capturar:
Esto suele hacerse usando hooks o bibliotecas auxiliares que encapsulan el proceso.
Los hooks permiten interceptar información durante el forward o backward. En este caso, sirven para guardar activaciones y gradientes de la capa elegida.
No hace falta dominar todos sus detalles aún, pero conviene saber que son una herramienta importante de introspección en PyTorch.
Grad-CAM puede implementarse manualmente, pero para fines prácticos muchas veces conviene usar bibliotecas ya preparadas. Eso reduce errores y permite enfocarse más en la interpretación que en los detalles de bajo nivel.
Una forma moderna y bastante cómoda de trabajar con Grad-CAM puede verse así:
import torch
from PIL import Image
from torchvision import models
from torchvision.models import ResNet18_Weights
from pytorch_grad_cam import GradCAM
from pytorch_grad_cam.utils.image import show_cam_on_image
weights = ResNet18_Weights.DEFAULT
model = models.resnet18(weights=weights)
model.eval()
target_layer = model.layer4[-1]
cam = GradCAM(model=model, target_layers=[target_layer])
imagem = Image.open("foto1.jpg").convert("RGB")
preprocess = weights.transforms()
input_tensor = preprocess(imagem).unsqueeze(0)
grayscale_cam = cam(input_tensor=input_tensor)[0]
print(grayscale_cam.shape)
Este ejemplo muestra la lógica general: elegir un modelo, seleccionar una capa objetivo y obtener un mapa Grad-CAM para la entrada.
La elección de la capa objetivo importa mucho. En una ResNet, una opción frecuente es usar el último bloque convolucional profundo, por ejemplo en layer4.
La razón es que allí la red ya codifica rasgos semánticos potentes, pero todavía mantiene cierta estructura espacial útil para producir el mapa.
Si el mapa Grad-CAM se concentra sobre el objeto relevante, eso sugiere que la red está utilizando una evidencia visual razonable. Si activa zonas irrelevantes, eso puede ser una señal de problema.
Pero siempre hay que interpretar el resultado con prudencia: un mapa visualmente plausible no garantiza por sí solo que el modelo sea robusto o causalmente correcto.
Entre sus limitaciones más importantes están:
Por eso Grad-CAM debe verse como una ayuda interpretativa, no como una verdad absoluta sobre el modelo.
Algunos errores frecuentes son:
La interpretabilidad con técnicas como Grad-CAM agrega una dimensión muy valiosa al trabajo con modelos de visión por computadora. Ya no se trata solo de saber si el modelo acierta, sino también de examinar qué regiones parecen estar guiando sus decisiones.
Esto ayuda a detectar sesgos, errores de razonamiento y dependencias espurias que podrían pasar desapercibidas si solo observamos métricas globales. En contextos reales, esa capacidad de inspección puede ser tan importante como la precisión misma.
En el próximo tema nos enfocaremos en otro aspecto muy práctico: la optimización de modelos de visión por computadora, donde veremos cómo mejorar eficiencia, velocidad y viabilidad de despliegue.