Al final del mòdul anterior vam entrenar una xarxa densa 784-128-64-10 que assolia un ~97.7 % d'encert a MNIST, i vam acabar amb un advertiment: per aconseguir-ho vam haver d'aplanar cada imatge de 28×28 píxels en un vector de 784 números, destruint tota la informació sobre quin píxel era al costat de quin. Amb dígits diminuts en blanc i negre ens ho vam poder permetre; amb les fotos reals de productes que pugen els venedors de TecnoMarket, no. En aquesta lliçó veurem amb números per què les xarxes denses no escalen a imatges realistes, i coneixerem l'arquitectura que domina la visió per computador des del 2012: la xarxa neuronal convolucional (CNN, Convolutional Neural Network). Entendràs les seves tres idees fonamentals, faràs una convolució a mà amb una matriu petita i veuràs l'anatomia general d'una CNN completa.

Contingut

  1. Per què les xarxes denses fallen amb imatges
  2. Les tres idees clau de les CNN
  3. L'operació de convolució pas a pas
  4. Anatomia general d'una CNN

Per què les xarxes denses fallen amb imatges

El problema 1: explosió de paràmetres

Recordem el mètode de recompte de paràmetres del mòdul 2: una capa densa amb n entrades i m neurones té n × m pesos més m biaixos.

A MNIST, la imatge era de 28×28 píxels en escala de grisos:

  • Entrada aplanada: 28 × 28 = 784 valors.
  • Primera capa densa de 128 neurones: 784 × 128 + 128 = 100 480 paràmetres.

Manejable. Però una foto de producte de TecnoMarket, fins i tot reduïda a la mida estàndard que fan servir molts models de visió, és de 224×224 píxels i 3 canals de color (vermell, verd, blau):

  • Entrada aplanada: 224 × 224 × 3 = 150 528 valors.
  • Primera capa densa de 128 neurones: 150 528 × 128 + 128 = 19 267 712 paràmetres.

Més de 19 milions de paràmetres només a la primera capa, gairebé 200 vegades més que a MNIST. I 224×224 és una imatge petita: la foto d'un frigorífic que puja un venedor pot ser de 2000×1500 píxels. Comprovem-ho amb Python:

# Recompte de parametres de la primera capa densa segons la mida d'imatge
mides = [
    ("MNIST 28x28x1", 28 * 28 * 1),
    ("Producte 224x224x3", 224 * 224 * 3),
    ("Foto venedor 1024x768x3", 1024 * 768 * 3),
]

neurones = 128
for nom, entrades in mides:
    parametres = entrades * neurones + neurones
    print(f"{nom:28s} -> entrada: {entrades:>9,} "
          f"-> 1a capa densa: {parametres:>13,} parametres")

Sortida:

MNIST 28x28x1                -> entrada:       784 -> 1a capa densa:       100,480 parametres
Producte 224x224x3           -> entrada:   150,528 -> 1a capa densa:    19,267,712 parametres
Foto venedor 1024x768x3      -> entrada: 2,359,296 -> 1a capa densa:   301,990,016 parametres

Amb la foto d'un venedor, 302 milions de paràmetres en una sola capa. Més paràmetres vol dir més memòria, més còmput, més dades necessàries per entrenar sense sobreajustar (recorda el sobreajust lleu que ja vam detectar a 02-05 amb només 100 000 paràmetres) i més lentitud. Aquest camí no escala.

El problema 2: pèrdua de l'estructura espacial

El segon problema és més subtil però igual de greu. En aplanar la imatge, el píxel (0, 0) i el píxel (0, 1) —veïns immediats— acaben a les posicions 0 i 1 del vector, però el píxel (1, 0), que és just a sota del primer, acaba a la posició 28 (o 224, o 1024...). La xarxa densa no té ni idea que aquells píxels eren veïns: per a ella el vector d'entrada és una llista de números sense geometria.

Conseqüències pràctiques per a TecnoMarket:

  • Una vora vertical (el cantell d'un portàtil) és un patró local de píxels veïns; la xarxa densa no el pot explotar directament.
  • Si el producte apareix desplaçat 10 píxels a la dreta a la foto, per a la xarxa densa és una entrada completament diferent: hauria de reaprendre el mateix patró a cada posició possible.
  • Cada neurona de la primera capa mira tots els píxels alhora, quan la majoria de patrons útils (vores, cantonades, textures) ocupen regions diminutes.

Necessitem una arquitectura que respecti l'estructura 2D de la imatge i que reconegui un patró independentment d'on aparegui. Això és exactament el que fa una CNN.

Les tres idees clau de les CNN

Les CNN es recolzen en tres principis que ataquen directament els dos problemes anteriors.

  1. Connectivitat local

En lloc de connectar cada neurona amb tots els píxels, cada neurona d'una capa convolucional mira només una finestra petita de la imatge (per exemple, 3×3 píxels), anomenada el seu camp receptiu. És la mateixa lògica que faries servir tu: per decidir si en una cantonada de la foto hi ha una vora, no cal mirar la foto sencera, només aquella cantonada.

Tornant a l'analogia del comitè de compres del mòdul 1: en comptes d'un comitè on cada membre llegeix el catàleg complet, ara cada membre s'especialitza a inspeccionar una petita zona del producte.

  1. Pesos compartits

Aquí hi ha el gran truc d'eficiència: la mateixa finestra de pesos (el filtre o kernel) es desplaça per tota la imatge. Si un filtre de 3×3 ha après a detectar vores verticals, detectarà vores verticals a la cantonada superior esquerra, al centre i a baix a la dreta, amb els mateixos 9 pesos.

  • Un filtre 3×3 sobre una imatge en escala de grisos: 9 pesos + 1 biaix = 10 paràmetres, tant se val si la imatge és de 28×28 o de 1024×768.
  • Compara-ho amb els 19 milions de la capa densa sobre la imatge 224×224×3.

A més, això dona a la xarxa una propietat valuosíssima anomenada equivariància a la translació: si el microones es desplaça a la foto, el seu patró d'activació es desplaça amb ell, però es continua detectant. No cal reaprendre res per posició.

  1. Jerarquia de característiques

A 01-01 vam definir el deep learning com l'aprenentatge d'una jerarquia de representacions, del que és simple al que és abstracte. Les CNN són la materialització més clara d'aquesta idea. En apilar capes convolucionals:

Nivell Què detecta Exemple en una foto de producte
Primeres capes Vores i colors Línies verticals/horitzontals, transicions clar-fosc
Capes intermèdies Textures i motius Reixeta metàl·lica, superfície de plàstic, fusta
Capes mitjanes-altes Parts d'objectes Una pantalla, una nansa, un teclat, una porta de frigorífic
Últimes capes Objectes complets "Això és un portàtil", "això és una cafetera"

Cada capa combina les deteccions de l'anterior: les vores es combinen en textures, les textures en parts, les parts en objectes. Ningú no programa aquesta jerarquia; emergeix de l'entrenament, igual que a la xarxa 3-8-1 de comandes fictícies els pesos van aprendre sols quines combinacions delataven un frau.

L'operació de convolució pas a pas

Vegem la mecànica exacta de com un filtre "es desplaça" per una imatge. Treballarem amb una imatge de joguina de 5×5 (imagina un retall diminut en escala de grisos d'una foto de producte, on a l'esquerra hi ha fons fosc i a la dreta el producte clar) i un filtre de 3×3.

Imatge d'entrada (5×5):

0  0  1  1  1
0  0  1  1  1
0  0  1  1  1
0  0  1  1  1
0  0  1  1  1

Hi ha una vora vertical entre la columna de zeros (fosc) i les columnes d'uns (clar).

Filtre detector de vores verticals (3×3):

 1  0 -1
 1  0 -1
 1  0 -1

Aquest filtre respon amb força quan la seva meitat esquerra veu valors diferents que la seva meitat dreta, és a dir, quan hi ha una transició vertical. (És una versió del clàssic filtre de Prewitt; la gràcia de les CNN és que aquests valors no es dissenyen a mà, sinó que s'aprenen per backpropagation com qualsevol altre pes.)

El procediment: col·loquem el filtre sobre la cantonada superior esquerra de la imatge, multipliquem cada pes pel píxel que té a sota, sumem els 9 productes i anotem el resultat. Després desplacem el filtre una posició cap a la dreta i repetim; en arribar al final de la fila, baixem una posició.

Posició (0,0), el filtre cobreix les 3 primeres files i columnes:

Finestra:       Filtre:         Productes:
0  0  1         1  0 -1         0  0 -1
0  0  1    ×    1  0 -1    =    0  0 -1
0  0  1         1  0 -1         0  0 -1

Suma = -3

Posició (0,1), ens desplacem una columna:

Finestra:       Filtre:         Productes:
0  1  1         1  0 -1         0  0 -1
0  1  1    ×    1  0 -1    =    0  0 -1
0  1  1         1  0 -1         0  0 -1

Suma = -3

Posició (0,2):

Finestra:       Filtre:         Productes:
1  1  1         1  0 -1         1  0 -1
1  1  1    ×    1  0 -1    =    1  0 -1
1  1  1         1  0 -1         1  0 -1

Suma = 0

Com que totes les files de la imatge són iguals, el resultat es repeteix en baixar. El mapa de característiques (feature map) resultant és de 3×3 (un filtre 3×3 sobre una imatge 5×5 cap en 3×3 posicions; a 03-02 veurem la fórmula general i com controlar aquesta mida):

-3 -3  0
-3 -3  0
-3 -3  0

Lectura: els valors grans en magnitud (aquí -3) assenyalen on és la vora vertical; el 0 assenyala zona uniforme. El mapa de característiques és literalment un "mapa d'on apareix el patró que busca aquest filtre". El signe depèn de l'orientació del contrast (fosc→clar aquí); després de la convolució s'aplica una activació com ReLU (02-02), i filtres amb signes oposats capturen cada orientació.

Verifiquem-ho amb numpy:

import numpy as np

imatge = np.array([
    [0, 0, 1, 1, 1],
    [0, 0, 1, 1, 1],
    [0, 0, 1, 1, 1],
    [0, 0, 1, 1, 1],
    [0, 0, 1, 1, 1],
], dtype=float)

filtre = np.array([
    [1, 0, -1],
    [1, 0, -1],
    [1, 0, -1],
], dtype=float)

def convolucio2d(imatge, filtre):
    """Convolucio 'valida': el filtre nomes es col·loca on cap sencer."""
    fi, ci = imatge.shape        # files i columnes de la imatge
    ff, cf = filtre.shape        # files i columnes del filtre
    sortida = np.zeros((fi - ff + 1, ci - cf + 1))
    for i in range(sortida.shape[0]):
        for j in range(sortida.shape[1]):
            finestra = imatge[i:i + ff, j:j + cf]   # retall 3x3 de la imatge
            sortida[i, j] = np.sum(finestra * filtre)  # producte element a element i suma
    return sortida

print(convolucio2d(imatge, filtre))

Sortida:

[[-3. -3.  0.]
 [-3. -3.  0.]
 [-3. -3.  0.]]

Coincideix amb el nostre càlcul a mà. Fixa't en el bucle: és exactament "col·locar, multiplicar, sumar, desplaçar". Tota capa convolucional, per gran que sigui, fa això mateix (de manera vectoritzada i amb molts filtres alhora).

Punts clau que convé fixar:

  • Un filtre = un detector d'un patró. Una capa convolucional real té molts filtres (32, 64...), cadascun buscant un patró diferent, i produeix un mapa de característiques per filtre.
  • Els valors del filtre són pesos entrenables: la xarxa els ajusta amb la mateixa maquinària de backpropagation i descens del gradient que ja domines de 02-03 i 02-04.
  • Després de la suma s'afegeix un biaix i s'aplica una activació (típicament ReLU), igual que en una neurona densa. Una capa conv és, en el fons, la neurona de sempre però amb connectivitat local i pesos compartits.

Anatomia general d'una CNN

Una CNN completa alterna dos tipus de blocs: una etapa convolucional que extreu característiques cada vegada més abstractes, i una etapa densa final que fa servir aquestes característiques per classificar. Entre convolucions s'intercalen capes de pooling, que redueixen la mida dels mapes (les estudiarem a fons a 03-02; de moment n'hi ha prou de saber que "resumeixen" regions per condensar la informació).

flowchart LR
    A["Foto de producte<br/>224x224x3"] --> B["Conv + ReLU<br/>detecta vores"]
    B --> C["Pooling<br/>redueix mida"]
    C --> D["Conv + ReLU<br/>detecta textures/parts"]
    D --> E["Pooling<br/>redueix mida"]
    E --> F["Flatten<br/>aplanar"]
    F --> G["Densa + ReLU"]
    G --> H["Densa softmax<br/>categoria: portatil,<br/>cafetera, monitor..."]

Observa l'ordre de les idees:

  1. Blocs conv + pooling (es repeteixen 2, 3 o moltes més vegades): construeixen la jerarquia vores → textures → parts → objectes, mantenint l'estructura espacial en tot moment.
  2. Flatten: només quan els mapes ja són petits i contenen característiques abstractes ("hi ha una pantalla", "hi ha tecles") aplanem. Aplanar aquí ja no és cap crim: la posició exacta ja importa poc, el que importa és què s'ha detectat.
  3. Capes denses finals: combinen aquestes deteccions per emetre la classificació, exactament com la xarxa 784-128-64-10 de 02-05, però rebent característiques amb significat en comptes de píxels crus.

Aquesta divisió de la feina és la clau: la part convolucional actua com un extractor de característiques après i la part densa com el classificador. Per al projecte estrella d'aquest mòdul —classificar automàticament les fotos que pugen els venedors de TecnoMarket— aquesta serà la plantilla mental; la tècnica l'anirem muntant peça a peça a les properes lliçons, i el projecte guiat complet arribarà a 07-01.

Errors Comuns i Consells

  • Pensar que els filtres es dissenyen a mà. El filtre de vores verticals que hem fet servir és il·lustratiu; en una CNN real els valors dels filtres s'inicialitzen a l'atzar i s'aprenen durant l'entrenament. La xarxa decideix sola quins detectors li convenen.
  • Confondre el filtre amb el mapa de característiques. El filtre són els pesos (el que la xarxa aprèn); el mapa de característiques és la sortida d'aplicar aquest filtre a una imatge concreta (canvia amb cada imatge).
  • Creure que les CNN eliminen les capes denses. No: gairebé tota CNN de classificació acaba en capes denses. Les convolucions extreuen característiques; les denses classifiquen.
  • Oblidar que la convolució és la mateixa neurona de sempre. Multiplicar per pesos, sumar, afegir biaix, activar: és el perceptró de 02-01 amb dues restriccions intel·ligents (localitat i pesos compartits). Si la backprop et va quedar clara a 02-03, ja saps com s'entrena una CNN.
  • Consell: quan vegis una arquitectura CNN nova, pregunta't sempre "on acaba l'extractor de característiques i on comença el classificador?". Aquesta lectura et servirà durant tot el curs, especialment en transfer learning (05-03).

Exercicis

Exercici 1: la factura de la capa densa

Els venedors de TecnoMarket pugen fotos que el sistema redimensiona a 128×128 en color (3 canals). Si connectéssim aquesta imatge aplanada a una primera capa densa de 256 neurones, quants paràmetres tindria aquesta capa? I quants paràmetres té un filtre convolucional de 5×5 aplicat a aquesta mateixa imatge en escala de grisos (1 canal)? Calcula tots dos a mà i compara.

Exercici 2: convolució a mà

Aplica a mà (i comprova-ho després amb la funció convolucio2d de la lliçó) el filtre detector de vores horitzontals sobre aquesta imatge 4×4, que té una franja clara a dalt i fosca a baix:

Imatge:            Filtre:
1  1  1  1          1  1  1
1  1  1  1          0  0  0
0  0  0  0         -1 -1 -1
0  0  0  0

Quina mida té el mapa de característiques resultant? En quines posicions respon amb més força i per què?

Exercici 3: classificar les tres idees

Per a cada situació, indica quina de les tres idees clau de les CNN (connectivitat local, pesos compartits, jerarquia de característiques) l'explica millor:

  1. El mateix detector de "cantonada metàl·lica" funciona tant si la torradora surt centrada com a la vora de la foto.
  2. Una neurona de la primera capa només processa una zona de 3×3 píxels.
  3. La capa 8 de la xarxa respon davant de "portes de frigorífic" combinant deteccions de "vora recta", "superfície llisa" i "nansa" de capes anteriors.

Solucions

Exercici 1:

  • Capa densa: entrada = 128 × 128 × 3 = 49 152 valors. Paràmetres = 49 152 × 256 + 256 = 12 583 168 (uns 12.6 milions).
  • Filtre conv 5×5 sobre 1 canal: 5 × 5 = 25 pesos + 1 biaix = 26 paràmetres.
  • Comparació: la capa densa necessita ~484 000 vegades més paràmetres que un filtre. Encara que una capa conv real faci servir 32 o 64 filtres (26 × 64 = 1664 paràmetres), la diferència continua sent de quatre ordres de magnitud. A més, el nombre de paràmetres del filtre no depèn de la mida de la imatge.

Exercici 2:

El mapa resultant és de (4−3+1) × (4−3+1) = 2×2. Calculant cada posició:

  • Posició (0,0): finestra = files 0-2, columnes 0-2 → (1+1+1) + 0 − (0+0+0) = 3
  • Posició (0,1): mateixa estructura → 3
  • Posició (1,0): finestra = files 1-3 → (1+1+1) + 0 − (0+0+0) = 3
  • Posició (1,1): → 3
3  3
3  3

Totes les posicions responen amb força perquè totes les finestres 3×3 possibles contenen la transició clar→fosc: la franja horitzontal travessa la imatge sencera, i amb només 4 files, qualsevol finestra de 3 files la inclou. La fila superior del filtre cau sobre valors clars i la inferior sobre foscos (o sobre la transició), i aquesta diferència és just el que mesura el filtre. En una imatge més gran, amb zones uniformes lluny de la vora, veuríem zeros fora de la franja i valors alts només al llarg de la vora.

Exercici 3:

  1. Pesos compartits: el mateix filtre s'aplica a totes les posicions, així que el patró es detecta sigui on sigui (equivariància a la translació).
  2. Connectivitat local: el camp receptiu de la neurona és una finestra petita, no la imatge completa.
  3. Jerarquia de característiques: les capes profundes componen deteccions de capes anteriors per representar conceptes cada vegada més abstractes.

Conclusió

Hem tancat el cercle que vam obrir al final del mòdul 2: les xarxes denses no escalen a imatges reals perquè exploten en paràmetres (19 milions en una sola capa per a una modesta foto de 224×224×3) i perquè aplanar destrueix la geometria de la imatge. Les CNN resolen tots dos problemes amb tres idees: connectivitat local (cada neurona mira una finestra petita), pesos compartits (el mateix filtre es desplaça per tota la imatge, amb només desenes de paràmetres) i jerarquia de característiques (vores → textures → parts → objectes, la "jerarquia de representacions" de 01-01 feta arquitectura). Has executat l'operació de convolució a mà i amb numpy, i ja saps llegir l'anatomia d'una CNN: blocs conv+pooling que extreuen característiques i capes denses que classifiquen.

Però hem deixat caps per lligar a propòsit: per què el mapa de característiques sortia de 3×3 i no de 5×5? Es pot evitar que la imatge s'encongeixi? Què fa exactament el pooling i quants paràmetres té una capa convolucional amb molts filtres i canals de color? Tot això —stride, padding, canals, fórmules de mida i les capes Conv2D i MaxPooling2D de Keras— és el terreny de la lliçó següent: capes convolucionals i de pooling.

Curs de Deep Learning

Mòdul 1: Introducció al Deep Learning

Mòdul 2: Fonaments de Xarxes Neuronals

Mòdul 3: Xarxes Neuronals Convolucionals (CNN)

Mòdul 4: Xarxes Neuronals Recurrents (RNN)

Mòdul 5: Tècniques Avançades en Deep Learning

Mòdul 6: Eines i Frameworks

Mòdul 7: Projectes Pràctics

Mòdul 8: Consideracions Ètiques i Futur del Deep Learning

© Copyright 2026. Tots els drets reservats