A 03-03 vam catalogar les grans arquitectures de CNN —VGG, ResNet, MobileNet, EfficientNet— i vam tancar amb una promesa: no cal entrenar-les des de zero per fer-les servir. Aquesta lliçó compleix aquesta promesa. El transfer learning (aprenentatge per transferència) consisteix a agafar un model entrenat en un problema gran i genèric i reutilitzar-ne el coneixement en el teu problema petit i específic. És, amb diferència, la tècnica amb millor relació esforç/resultat del deep learning pràctic: és la raó per la qual TecnoMarket pot tenir un classificador de categories de producte de qualitat professional amb unes desenes de fotos per categoria, en lloc de necessitar-ne milions.

Contingut

  1. Per què entrenar des de zero és un luxe
  2. La intuïció: els trets genèrics es transfereixen
  3. Dues estratègies: extracció de característiques i fine-tuning
  4. Quan fer servir cada estratègia
  5. Exemple complet en Keras: MobileNetV2 per al catàleg de TecnoMarket
  6. Fine-tuning: descongelar amb compte
  7. Transfer learning més enllà de les imatges

Per què entrenar des de zero és un luxe

Posem números concrets al problema. Les arquitectures de 03-03 es van entrenar sobre ImageNet: ~1,28 milions d'imatges etiquetades en 1000 classes. Entrenar una d'aquestes xarxes des de zero implica:

  • Dades: reunir i etiquetar de l'ordre d'un milió d'imatges. Etiquetar a mà, fins i tot a pocs cèntims per imatge, costa desenes de milers d'euros i mesos de feina.
  • Còmput: l'entrenament original d'una ResNet-50 sobre ImageNet requeria de l'ordre de setmanes en una GPU de l'època; avui, amb maquinari modern, continua sent hores o dies de GPU cara (centenars o milers d'euros al núvol per experiment — i rarament surt bé al primer experiment).
  • Experiència: ajustar hiperparàmetres d'un entrenament així és un ofici en si mateix.

Ara la realitat de TecnoMarket: per classificar fotos de productes en, diguem, 8 categories, l'equip disposa d'unes 200 fotos per categoria (~1600 imatges). Amb tan poques dades, una CNN entrenada des de zero memoritzarà el conjunt d'entrenament — el sobreajust que ja va treure el cap a 02-05, però en versió severa.

La sortida: algú (Google, en el cas de MobileNet) ja va pagar el luxe. Els pesos resultants estan publicats i Keras els descarrega amb un argument (weights="imagenet"). La pregunta és com aprofitar-los.

La intuïció: els trets genèrics es transfereixen

Recorda la jerarquia de representacions de 03-01: una CNN aprèn vores → textures → parts → objectes, de les primeres capes a les últimes. L'observació clau del transfer learning és que aquesta jerarquia es torna específica només al final:

  • Les primeres capes detecten vores, cantonades, gradients de color, textures bàsiques. Aquests trets són universals: serveixen igual per distingir gats que per distingir cafeteres de torradores. Una xarxa entrenada en ImageNet ja els té, i són essencialment els mateixos que aprendria amb les teves dades... si en tinguessis prou.
  • Les capes intermèdies detecten motius i parts (reixetes, nanses, superfícies metàl·liques, pantalles) — encara força reutilitzables per a fotos de producte.
  • Les últimes capes ho combinen tot en conceptes específics de les 1000 classes d'ImageNet ("husky siberià", "telèfon de disc"). Aquestes són les menys transferibles: TecnoMarket no ven huskies.

Per tant, la recepta general: conservar la base convolucional (el coneixement visual genèric, caríssim d'obtenir) i substituir el cap classificador (allò específic del problema original) per un de nou adaptat a les teves classes.

flowchart LR
    subgraph Preentrenat en ImageNet
        A[Primeres capes<br/>vores i textures<br/>MOLT transferibles] --> B[Capes intermedies<br/>parts i motius<br/>transferibles]
    end
    B --> C[Cap original<br/>1000 classes ImageNet<br/>es descarta]
    B --> D[Cap NOU<br/>8 categories TecnoMarket<br/>s'entrena]
    style C stroke-dasharray: 5 5

Dues estratègies

Hi ha dues maneres de reutilitzar la base, ordenades de més conservadora a més ambiciosa:

1. Extracció de característiques (base congelada). La base convolucional es congela (trainable = False): els seus pesos no es toquen. Actua com una funció fixa que converteix cada imatge en un vector de trets —un embedding, exactament el concepte de 03-04—, i només s'entrena el cap nou a sobre. Avantatges: rapidíssim, impossible espatllar el coneixement preentrenat, funciona amb molt poques dades (el cap té pocs paràmetres per ajustar).

2. Fine-tuning (ajust fi). Després d'entrenar el cap, es descongelen les últimes capes de la base i se segueix entrenant tot junt amb un learning rate molt baix. La base adapta els seus trets d'alt nivell al domini nou (les fotos de producte tenen fons blancs i enquadraments frontals que ImageNet no emfatitza). Avantatge: més precisió potencial. Risc: amb poques dades o un learning rate alegre, pots destruir els trets preentrenats (fenomen conegut com a catastrophic forgetting) i sobreajustar.

Quan fer servir cada estratègia

La decisió depèn de dos eixos: quantes dades tens i com s'assembla el teu domini a ImageNet.

Dataset petit (centenars–pocs milers) Dataset gran (desenes de milers+)
Domini semblant a ImageNet (fotos naturals: productes, animals, escenes) Extracció de característiques. Els trets ja serveixen i no hi ha dades per a més Fine-tuning de les últimes capes (o de més capes): hi ha dades per afinar sense trencar
Domini diferent (radiografies, imatges per satèl·lit, espectrogrames) El cas difícil: extreure característiques de capes intermèdies (les últimes són massa "ImageNet") i considerar augment de dades agressiu (05-04) Fine-tuning profund, fins i tot de gairebé tota la xarxa: els trets alts s'han de reaprendre

TecnoMarket cau a la cel·la superior esquerra-a-mitjana: fotos naturals de productes (domini semblant) amb ~1600 imatges (petit). Començarem per extracció de característiques i aplicarem un fine-tuning suau després.

Exemple complet en Keras: MobileNetV2 per al catàleg

Triem MobileNetV2 (de 03-03: la família dissenyada per ser lleugera i ràpida, ideal si el classificador s'executarà als servidors modestos de TecnoMarket o al mòbil dels operaris de magatzem).

Suposa les imatges organitzades en carpetes per categoria (dades/cafeteres/, dades/torradores/, ...), el format que image_dataset_from_directory llegeix directament:

from tensorflow import keras
from tensorflow.keras import layers

MIDA = (160, 160)         # MobileNetV2 accepta diverses mides; 160x160 es lleuger
N_CLASSES = 8

# 1. Carregar les dades amb particio train/validacio
train_ds = keras.utils.image_dataset_from_directory(
    "tecnomarket-dl/dades/productes", validation_split=0.2, subset="training",
    seed=42, image_size=MIDA, batch_size=32)
val_ds = keras.utils.image_dataset_from_directory(
    "tecnomarket-dl/dades/productes", validation_split=0.2, subset="validation",
    seed=42, image_size=MIDA, batch_size=32)

# 2. Base preentrenada, SENSE el seu cap de 1000 classes
base = keras.applications.MobileNetV2(
    input_shape=MIDA + (3,),
    include_top=False,        # descartem el cap d'ImageNet
    weights="imagenet",       # descarreguem el coneixement preentrenat
)
base.trainable = False        # CONGELADA: extraccio de caracteristiques

# 3. Model complet: preprocessament + base + cap nou
entrades = keras.Input(shape=MIDA + (3,))
# Cada arquitectura espera la seva normalitzacio concreta; fer servir SEMPRE la seva
x = keras.applications.mobilenet_v2.preprocess_input(entrades)  # a [-1, 1]
x = base(x, training=False)   # training=False: fixa tambe les BatchNorm
x = layers.GlobalAveragePooling2D()(x)  # mapa 5x5x1280 -> vector de 1280
x = layers.Dropout(0.2)(x)              # una mica de regularitzacio (05-04)
sortides = layers.Dense(N_CLASSES, activation="softmax")(x)
model = keras.Model(entrades, sortides)

model.compile(optimizer=keras.optimizers.Adam(1e-3),
              loss="sparse_categorical_crossentropy",
              metrics=["accuracy"])

# 4. Entrenar NOMES el cap (la base esta congelada)
historial = model.fit(train_ds, validation_data=val_ds, epochs=10)

Desglossament de les decisions:

  • include_top=False: descarta les capes finals específiques d'ImageNet; ens quedem amb la base convolucional, que emet un mapa de trets 5×5×1280.
  • GlobalAveragePooling2D: fa la mitjana de cadascun dels 1280 mapes a un sol número → vector de 1280. És la versió "sense paràmetres" d'aplanar + densa, i redueix el risc de sobreajust del cap.
  • preprocess_input: cada arquitectura es va entrenar amb la seva pròpia normalització (MobileNetV2 espera píxels a [-1, 1]). Saltar-s'ho és l'error silenciós més comú: la xarxa "funciona" però rendeix malament.
  • base(x, training=False): a més de congelar pesos, fixa les estadístiques de les capes BatchNormalization de la base (veuràs què són a 05-04); és la manera correcta de fer servir una base congelada en Keras.
  • Si executes model.summary() (l'hàbit que vas adquirir a 03-02) veuràs una cosa reveladora: ~2,26 milions de paràmetres no entrenables (la base) i només ~10 000 d'entrenables (el cap). Estàs entrenant el 0,5 % de la xarxa.

Amb aquest esquema, és habitual passar d'un 50-60 % d'accuracy (CNN petita des de zero amb 1600 imatges) a un 85-90 %+ en poques èpoques. Aquest salt és el coneixement d'ImageNet treballant gratis.

Fine-tuning: descongelar amb compte

Segona fase, opcional però habitual: descongelar la part alta de la base per adaptar-la al domini "foto de producte".

# 1. Descongelar NOMES el tram final de la base
base.trainable = True
for capa in base.layers[:-30]:     # totes menys les ultimes ~30 capes
    capa.trainable = False         # segueixen congelades

# 2. RECOMPILAR amb un learning rate MOLT baix (100x menor)
model.compile(optimizer=keras.optimizers.Adam(1e-5),   # abans 1e-3
              loss="sparse_categorical_crossentropy",
              metrics=["accuracy"])

# 3. Poques epoques mes, vigilant la corba de validacio
historial_ft = model.fit(train_ds, validation_data=val_ds, epochs=5)

Les tres regles d'or del fine-tuning:

  1. Primer el cap, després la base. Si descongeles amb el cap encara aleatori, els seus gradients grans i caòtics —el repartiment de culpa de 02-03 en la seva versió més destructiva— arrasen els pesos preentrenats.
  2. Learning rate molt baix (típicament 10⁻⁵, dos ordres per sota de l'habitual). Estàs retocant coneixement valuós, no aprenent des de zero: passos petits.
  3. Descongelar de dalt cap a baix. Les últimes capes (les més específiques) primer; les primeres (vores i textures universals) gairebé mai val la pena tocar-les.

Si després del fine-tuning l'accuracy de validació cau mentre la d'entrenament puja, has entrat en sobreajust: torna al checkpoint anterior i queda't amb la base congelada, o afegeix regularització (propera lliçó).

El projecte guiat complet —amb avaluació fina, matriu de confusió per categoria i anàlisi d'errors— és la lliçó 07-05; allà portarem aquest mateix esquema fins a un model defensable en producció.

Transfer learning més enllà de les imatges

La idea no és exclusiva de la visió:

  • Embeddings de paraules preentrenats: a 04-03 vam entrenar la capa Embedding des de zero; també es poden carregar vectors ja entrenats sobre milers de milions de paraules (Word2Vec, GloVe) — és transfer learning per a la primera capa d'un model de text.
  • Models de llenguatge preentrenats: la versió moderna i molt més potent — models entrenats per "entendre l'idioma" en general que després s'afinen per a sentiment, classificació de ressenyes o cerca. Són els BERT i companyia que veurem a la propera lliçó (05-05), on aquesta idea de transferència es trobarà amb l'arquitectura Transformer.

El patró és sempre el mateix: coneixement genèric car, entrenat una vegada per qui pot pagar-lo; adaptació específica barata, a l'abast de qualsevol. És probablement el concepte individual més important per aplicar deep learning en una empresa real.

Errors Comuns i Consells

  • Oblidar el preprocess_input de l'arquitectura triada. Cada família espera el seu rang/normalització. Amb la normalització equivocada no hi ha error d'execució, només mètriques mediocres i inexplicables. És el primer sospitós quan un model preentrenat rendeix estrany.
  • Descongelar-ho tot i entrenar amb el learning rate de sempre. Resultat típic: en dues èpoques la xarxa oblida ImageNet i rendeix pitjor que congelada. Base congelada primer, lr ~10⁻⁵ després.
  • Oblidar recompilar després de canviar trainable. En Keras, canviar trainable no té efecte fins que tornes a cridar compile(). Si les teves corbes no canvien després de "descongelar", gairebé segur que és això.
  • Avaluar només l'accuracy global. Amb categories desequilibrades (moltes fotos de mòbils, poques de fregidores) l'accuracy enganya; mira el rendiment per classe — ho farem sistemàticament a 07-05.
  • Triar una base gegant per defecte. Si el classificador ha de respondre en mil·lisegons en producció, EfficientNet-B7 sobra; MobileNetV2 o EfficientNet-B0 (recorda les mides relatives de 03-03) solen ser el punt dolç.
  • Ignorar la llicència i procedència dels pesos. Per a ús comercial a TecnoMarket, verifica que els pesos preentrenats permeten aquest ús (els de keras.applications sí, però no tot el que hi ha publicat a internet).

Exercicis

Exercici 1. L'equip de TecnoMarket vol classificar radiografies de paquets de l'escàner de seguretat del magatzem en "normal" / "revisar", amb només 800 imatges etiquetades. Fent servir la taula 2×2, raona quina estratègia de transfer learning aplicaries i quina precaució especial prendries respecte a quines capes de la base fer servir.

Exercici 2. Un company executa aquest codi i es queixa que el fine-tuning "no fa res" (les corbes són idèntiques a les de la fase congelada). Troba els dos errors:

base.trainable = True
for capa in base.layers[:-30]:
    capa.trainable = False
historial_ft = model.fit(train_ds, validation_data=val_ds, epochs=5)
# (el model es va compilar abans de tocar trainable, amb Adam(1e-3))

Exercici 3. Explica per què GlobalAveragePooling2D + Dense(8) produeix un cap amb molts menys paràmetres que Flatten() + Dense(8) sobre un mapa de sortida de 5×5×1280, calculant aproximadament els paràmetres de la capa densa en cada cas, i per què això importa amb un dataset petit.

Solucions

Solució 1.

És la cel·la dataset petit + domini diferent (les radiografies no s'assemblen a les fotos naturals d'ImageNet): el cas difícil. Estratègia: extracció de característiques, però amb la precaució de no refiar-se de les últimes capes de la base, que codifiquen conceptes molt "ImageNet" (animals, objectes quotidians) poc útils per a radiografies; convé extreure trets de capes intermèdies (textures, formes, contrastos, que sí que són universals) i entrenar el cap a sobre. Complements assenyats: augment de dades agressiu (05-04) i, si s'aconsegueixen més imatges amb el temps, migrar a fine-tuning profund. Un fine-tuning agressiu d'entrada, amb 800 imatges, sobreajustaria.

Solució 2.

  1. No es va recompilar el model després de canviar trainable: en Keras el canvi no té efecte fins a cridar compile() de nou, així que la base segueix efectivament congelada. Aquest és el motiu que "no faci res".
  2. Quan el recompili, ha d'abaixar el learning rate: recompilar amb l'Adam(1e-3) original faria el contrari de "no fer res" — passos massa grans que degradarien els pesos preentrenats. El correcte: model.compile(optimizer=keras.optimizers.Adam(1e-5), ...) i llavors fit.

Solució 3.

  • Amb Flatten(): el mapa 5×5×1280 es converteix en un vector de 5·5·1280 = 32 000 valors; la densa de 8 sortides necessita 32 000·8 + 8 ≈ 256 000 paràmetres.
  • Amb GlobalAveragePooling2D: cadascun dels 1280 mapes es redueix per mitjana a un número → vector de 1280; la densa necessita 1280·8 + 8 ≈ 10 000 paràmetres (25 vegades menys).

Amb només ~1600 imatges, un cap de 256 000 paràmetres té capacitat de sobres per memoritzar el conjunt d'entrenament (sobreajust); el de 10 000 es veu obligat a recolzar-se en els trets de la base, que és exactament el que volem. A més, el pooling global fa el cap independent de la mida espacial del mapa d'entrada.

Conclusió

El transfer learning converteix el major obstacle del deep learning —el cost de dades i còmput— en un problema ja resolt per altres: la base convolucional preentrenada aporta els trets genèrics (vores, textures, parts: la jerarquia de 03-01) i tu només pagues l'adaptació específica, triant entre base congelada (poques dades) i fine-tuning amb learning rate baix (més dades, més precisió). Amb MobileNetV2 i unes 1600 fotos, el classificador de catàleg de TecnoMarket va saltar a una altra lliga, i a 07-05 el portarem fins a l'avaluació de nivell producció.

Però tant aquest model com tots els anteriors comparteixen un enemic que portem esquivant des de les corbes de 02-05: el sobreajust. La propera lliçó l'aborda de cara, amb l'arsenal complet — L1/L2, Dropout, Batch Normalization, Early Stopping i augment de dades — per millorar qualsevol xarxa d'aquest curs.

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