L'aprenentatge per transferència és una tècnica poderosa en el camp de l'aprenentatge automàtic que permet utilitzar un model preentrenat en una tasca similar per millorar el rendiment i reduir el temps d'entrenament en una nova tasca. En aquest tema, aprendrem com utilitzar models preentrenats amb TensorFlow per aplicar l'aprenentatge per transferència.

Continguts

  1. Què és l'aprenentatge per transferència?
  2. Avantatges de l'aprenentatge per transferència
  3. Com utilitzar models preentrenats amb TensorFlow
  4. Exemple pràctic: Classificació d'imatges amb un model preentrenat
  5. Exercicis pràctics

  1. Què és l'aprenentatge per transferència?

L'aprenentatge per transferència implica prendre un model que ha estat entrenat en una gran quantitat de dades en una tasca específica i reutilitzar-lo com a punt de partida per a una nova tasca. Això és especialment útil quan no es disposa d'una gran quantitat de dades per entrenar un model des de zero.

  1. Avantatges de l'aprenentatge per transferència

  • Reducció del temps d'entrenament: Els models preentrenats ja han après característiques útils, per la qual cosa necessiten menys temps per adaptar-se a la nova tasca.
  • Millor rendiment: Els models preentrenats solen oferir un millor rendiment, especialment quan es disposa de poques dades.
  • Menor necessitat de dades: Es pot aconseguir un bon rendiment amb menys dades d'entrenament.

  1. Com utilitzar models preentrenats amb TensorFlow

TensorFlow ofereix una àmplia gamma de models preentrenats a través de la seva biblioteca tf.keras.applications. Aquests models es poden carregar fàcilment i adaptar-se a noves tasques.

Passos per utilitzar un model preentrenat:

  1. Carregar el model preentrenat:

    import tensorflow as tf
    from tensorflow.keras.applications import VGG16
    
    # Carregar el model VGG16 preentrenat sense la capa de classificació final
    base_model = VGG16(weights='imagenet', include_top=False, input_shape=(224, 224, 3))
    
  2. Congelar les capes del model preentrenat:

    for layer in base_model.layers:
        layer.trainable = False
    
  3. Afegir capes personalitzades per a la nova tasca:

    from tensorflow.keras import layers, models
    
    model = models.Sequential([
        base_model,
        layers.Flatten(),
        layers.Dense(256, activation='relu'),
        layers.Dropout(0.5),
        layers.Dense(10, activation='softmax')  # Suposant que tenim 10 classes
    ])
    
  4. Compilar el model:

    model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
    
  5. Entrenar el model:

    # Suposant que tenim dades d'entrenament i validació
    model.fit(train_data, train_labels, epochs=10, validation_data=(val_data, val_labels))
    

  1. Exemple pràctic: Classificació d'imatges amb un model preentrenat

Descripció de l'exemple

En aquest exemple, utilitzarem el model preentrenat VGG16 per classificar imatges de gats i gossos. Utilitzarem un conjunt de dades reduït per demostrar com l'aprenentatge per transferència pot ajudar a obtenir bons resultats amb menys dades.

Codi complet de l'exemple

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

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

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

# Afegir capes personalitzades per a la nova tasca
model = models.Sequential([
    base_model,
    layers.Flatten(),
    layers.Dense(256, activation='relu'),
    layers.Dropout(0.5),
    layers.Dense(1, activation='sigmoid')  # Classificació binària: gats vs gossos
])

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

# Preparar les dades
train_datagen = ImageDataGenerator(rescale=1./255, shear_range=0.2, zoom_range=0.2, horizontal_flip=True)
val_datagen = ImageDataGenerator(rescale=1./255)

train_generator = train_datagen.flow_from_directory(
    'data/train',  # Directori amb les imatges d'entrenament
    target_size=(224, 224),
    batch_size=32,
    class_mode='binary'
)

val_generator = val_datagen.flow_from_directory(
    'data/validation',  # Directori amb les imatges de validació
    target_size=(224, 224),
    batch_size=32,
    class_mode='binary'
)

# Entrenar el model
model.fit(train_generator, epochs=10, validation_data=val_generator)

  1. Exercicis pràctics

Exercici 1: Utilitzar un model preentrenat diferent

  1. Carrega un model preentrenat diferent de tf.keras.applications (per exemple, ResNet50).
  2. Congela les capes del model preentrenat.
  3. Afegir capes personalitzades per a una nova tasca de classificació.
  4. Compila i entrena el model amb un conjunt de dades de la teva elecció.

Exercici 2: Ajustar les capes del model preentrenat

  1. Descongela algunes de les capes superiors del model preentrenat.
  2. Reentrena el model amb un conjunt de dades de la teva elecció.
  3. Compara els resultats amb els obtinguts quan totes les capes estaven congelades.

Solucions

Solució a l'Exercici 1

from tensorflow.keras.applications import ResNet50

# Carregar el model ResNet50 preentrenat sense la capa de classificació final
base_model = ResNet50(weights='imagenet', include_top=False, input_shape=(224, 224, 3))

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

# Afegir capes personalitzades per a la nova tasca
model = models.Sequential([
    base_model,
    layers.GlobalAveragePooling2D(),
    layers.Dense(256, activation='relu'),
    layers.Dropout(0.5),
    layers.Dense(1, activation='sigmoid')  # Classificació binària
])

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

# Entrenar el model (suposant que ja tenim els generadors de dades)
model.fit(train_generator, epochs=10, validation_data=val_generator)

Solució a l'Exercici 2

# Descongelar les capes superiors del model preentrenat
for layer in base_model.layers[-4:]:
    layer.trainable = True

# Compilar el model amb un aprenentatge més baix per evitar sobreajustament
model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=1e-5), loss='binary_crossentropy', metrics=['accuracy'])

# Reentrenar el model
model.fit(train_generator, epochs=10, validation_data=val_generator)

Conclusió

L'aprenentatge per transferència és una tècnica molt útil per millorar el rendiment dels models d'aprenentatge automàtic, especialment quan es disposa de poques dades. En aquest tema, hem après com utilitzar models preentrenats amb TensorFlow i hem vist un exemple pràctic de classificació d'imatges. Els exercicis pràctics proporcionats t'ajudaran a consolidar els coneixements adquirits i a experimentar amb diferents models i configuracions.

© Copyright 2024. Tots els drets reservats