Hoppa till innehållet
AI-grafen
E· Universitetdatorseende· ca 60 min· utvecklande· verifierad 2026-09-20

Visualisera vad ett CNN ser

Kunna visualisera filter och aktiveringar och tolka dem försiktigt.

Förkunskaper

Intuition

Vad har nätet lärt sig? Tre fönster in:

  1. Första lagrets filter kan ritas som små bilder: de blir kantdetektorer, färgövergångar, små texturer — förvånansvärt lika det biologiska synsystemet.
  2. Aktiveringskartor: mata in en bild, titta på utdata från ett lager. Ljusa fläckar = «det här filtret reagerade här».
  3. Saliency / Grad-CAM: gradienten av klass-poängen mot indata (eller sista faltningslagret) visar vilka pixlar som påverkade beslutet. Om «husky» avgörs av snön i bakgrunden ser du det här — och har hittat en genväg i datan.

Förbehåll: vackra bilder bevisar ingenting. En visualisering är en hypotes om vad nätet gör — testa den med interventioner (maska bort området, se om beslutet ändras).

Kod

import torch, matplotlib.pyplot as plt

# 1) första lagrets filter
w = m.f[0].weight.detach()                    # (32, 3, 3, 3)
fig, ax = plt.subplots(4, 8, figsize=(8, 4))
for i, a in enumerate(ax.flat):
    f = w[i]; f = (f - f.min()) / (f.max() - f.min())
    a.imshow(f.permute(1, 2, 0)); a.axis("off")
plt.savefig("filter.png")

# 2) aktiveringar via hook
akt = {}
m.f[3].register_forward_hook(lambda mod, i, o: akt.__setitem__("conv2", o.detach()))
m(x[None]); print(akt["conv2"].shape)         # (1, 64, 16, 16)

# 3) saliency: |dScore/dPixel|
x.requires_grad_(True)
m(x[None])[0, klass].backward()
sal = x.grad.abs().max(0).values              # (H, W)
plt.imsave("saliency.png", sal.numpy(), cmap="hot")

# intervention: maska det mest salienta området och se om sannolikheten faller

Behärskning innebär

  • Visualiserar första lagrets filter och mellanlagers aktiveringar
  • Tolkar visualiseringar med förbehåll
  • Använder saliency/Grad-CAM för att se vad som påverkade ett beslut

Logga in för att göra övningarna och bygga upp din behärskning.

Källor

Alla källor och licenser