Introducció a Transfer Learning

Transfer Learning és una tècnica en Deep Learning on un model desenvolupat per a una tasca inicial es reutilitza com a punt de partida per a un model en una tasca diferent però relacionada. Aquesta tècnica és especialment útil quan no es disposa d'una gran quantitat de dades per entrenar un model des de zero.

Conceptes Clau

  1. Model Preentrenat: Un model que ha estat entrenat en una gran base de dades per a una tasca específica, com ara la classificació d'imatges.
  2. Fine-Tuning: Ajustar els pesos d'un model preentrenat a una nova tasca amb un conjunt de dades més petit.
  3. Feature Extraction: Utilitzar les capes inicials d'un model preentrenat per extreure característiques i només entrenar les capes finals per a la nova tasca.

Avantatges del Transfer Learning

  • Reducció del temps d'entrenament: Comença amb un model que ja ha après característiques útils.
  • Millora del rendiment: Els models preentrenats solen tenir millor rendiment que els models entrenats des de zero amb petites quantitats de dades.
  • Menor necessitat de dades: Permet utilitzar menys dades per obtenir bons resultats.

Exemples de Transfer Learning

Exemple 1: Transfer Learning amb Keras

A continuació, es mostra un exemple pràctic de Transfer Learning utilitzant Keras amb un model preentrenat com VGG16 per a la classificació d'imatges.

import tensorflow as tf
from tensorflow.keras.applications import VGG16
from tensorflow.keras.models import Model
from tensorflow.keras.layers import Dense, Flatten
from tensorflow.keras.preprocessing.image import ImageDataGenerator

# Carregar el model VGG16 preentrenat sense les capes de classificació
base_model = VGG16(weights='imagenet', include_top=False, input_shape=(224, 224, 3))

# Congelar les capes del model base
for layer in base_model.layers:
    layer.trainable = False

# Afegir noves capes de classificació
x = base_model.output
x = Flatten()(x)
x = Dense(1024, activation='relu')(x)
predictions = Dense(10, activation='softmax')(x)

# Crear el nou model
model = Model(inputs=base_model.input, outputs=predictions)

# Compilar el model
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])

# Preparar les dades
train_datagen = ImageDataGenerator(rescale=1./255)
train_generator = train_datagen.flow_from_directory(
    'data/train',
    target_size=(224, 224),
    batch_size=32,
    class_mode='categorical'
)

# Entrenar el model
model.fit(train_generator, epochs=10, steps_per_epoch=100)

Exemple 2: Transfer Learning amb PyTorch

A continuació, es mostra un exemple pràctic de Transfer Learning utilitzant PyTorch amb un model preentrenat com ResNet50 per a la classificació d'imatges.

import torch
import torch.nn as nn
import torch.optim as optim
from torchvision import datasets, models, transforms

# Definir les transformacions per a les dades d'entrenament
data_transforms = transforms.Compose([
    transforms.Resize((224, 224)),
    transforms.ToTensor(),
])

# Carregar les dades d'entrenament
train_dataset = datasets.ImageFolder('data/train', transform=data_transforms)
train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=32, shuffle=True)

# Carregar el model ResNet50 preentrenat
model = models.resnet50(pretrained=True)

# Congelar les capes del model base
for param in model.parameters():
    param.requires_grad = False

# Afegir noves capes de classificació
num_ftrs = model.fc.in_features
model.fc = nn.Sequential(
    nn.Linear(num_ftrs, 1024),
    nn.ReLU(),
    nn.Linear(1024, 10),
    nn.Softmax(dim=1)
)

# Definir la funció de pèrdua i l'optimitzador
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.fc.parameters(), lr=0.001)

# Entrenar el model
model.train()
for epoch in range(10):
    running_loss = 0.0
    for inputs, labels in train_loader:
        optimizer.zero_grad()
        outputs = model(inputs)
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()
        running_loss += loss.item()
    print(f'Epoch {epoch+1}, Loss: {running_loss/len(train_loader)}')

Exercici Pràctic

Exercici: Transfer Learning amb MobileNetV2

  1. Carrega el model MobileNetV2 preentrenat utilitzant Keras.
  2. Congela les capes del model base.
  3. Afegiu noves capes de classificació per a una tasca de classificació amb 5 classes.
  4. Entrena el model amb un conjunt de dades d'imatges.

Solució

import tensorflow as tf
from tensorflow.keras.applications import MobileNetV2
from tensorflow.keras.models import Model
from tensorflow.keras.layers import Dense, Flatten
from tensorflow.keras.preprocessing.image import ImageDataGenerator

# Carregar el model MobileNetV2 preentrenat sense les capes de classificació
base_model = MobileNetV2(weights='imagenet', include_top=False, input_shape=(224, 224, 3))

# Congelar les capes del model base
for layer in base_model.layers:
    layer.trainable = False

# Afegir noves capes de classificació
x = base_model.output
x = Flatten()(x)
x = Dense(512, activation='relu')(x)
predictions = Dense(5, activation='softmax')(x)

# Crear el nou model
model = Model(inputs=base_model.input, outputs=predictions)

# Compilar el model
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])

# Preparar les dades
train_datagen = ImageDataGenerator(rescale=1./255)
train_generator = train_datagen.flow_from_directory(
    'data/train',
    target_size=(224, 224),
    batch_size=32,
    class_mode='categorical'
)

# Entrenar el model
model.fit(train_generator, epochs=10, steps_per_epoch=100)

Resum

En aquesta secció, hem après què és el Transfer Learning, els seus avantatges i com implementar-lo utilitzant Keras i PyTorch. També hem vist exemples pràctics i hem realitzat un exercici per consolidar els coneixements adquirits. Transfer Learning és una eina poderosa que pot millorar significativament el rendiment dels models de Deep Learning, especialment quan es disposa de dades limitades.

© Copyright 2024. Tots els drets reservats