Fine-tuning Options
L’apprentissage par transfert offre plusieurs options de conception pour adapter un modèle pré-entraîné à une nouvelle tâche. Ces options permettent de tirer parti des connaissances apprises par le modèle pré-entraîné tout en ajustant le modèle pour qu’il soit performant sur la nouvelle tâche. Voici les principales options de conception lors de l’utilisation de l’apprentissage par transfert :
1. Utilisation des poids pré-entraînés
Fine-tuning (ajustement fin)
Le fine-tuning consiste à ajuster les poids du modèle pré-entraîné en fonction des nouvelles données. Cela implique de dégeler certaines ou toutes les couches du modèle pré-entraîné et de les entraîner sur les nouvelles données.
Exemple de fine-tuning
import tensorflow as tffrom tensorflow.keras.applications import VGG16from tensorflow.keras.models import Modelfrom tensorflow.keras.layers import Dense, Flatten
# Charger le modèle VGG16 pré-entraîné sans les couches supérieuresbase_model = VGG16(weights='imagenet', include_top=False, input_shape=(224, 224, 3))
# Ajouter des couches supérieures pour la nouvelle tâchex = base_model.outputx = Flatten()(x)x = Dense(256, activation='relu')(x)predictions = Dense(2, activation='softmax')(x)
# Créer le modèle finalmodel = Model(inputs=base_model.input, outputs=predictions)
# Définir les couches à entraînerfor layer in base_model.layers: layer.trainable = True
# Compiler le modèlemodel.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
# Charger vos données d'entraînement et de validation# train_data, train_labels, val_data, val_labels = ...
# Entraîner le modèlemodel.fit(train_data, train_labels, epochs=10, validation_data=(val_data, val_labels))
Feature extraction (extraction de caractéristiques)
L’extraction de caractéristiques consiste à utiliser les couches inférieures du modèle pré-entraîné pour extraire des caractéristiques des nouvelles données, puis à entraîner un nouveau classificateur sur ces caractéristiques. Les couches inférieures du modèle pré-entraîné sont gelées (non entraînables).
Exemple d’extraction de caractéristiques
import tensorflow as tffrom tensorflow.keras.applications import VGG16from tensorflow.keras.models import Modelfrom tensorflow.keras.layers import Dense, Flatten
# Charger le modèle VGG16 pré-entraîné sans les couches supérieuresbase_model = VGG16(weights='imagenet', include_top=False, input_shape=(224, 224, 3))
# Ajouter des couches supérieures pour la nouvelle tâchex = base_model.outputx = Flatten()(x)x = Dense(256, activation='relu')(x)predictions = Dense(2, activation='softmax')(x)
# Créer le modèle finalmodel = Model(inputs=base_model.input, outputs=predictions)
# Geler les couches du modèle pré-entraînéfor layer in base_model.layers: layer.trainable = False
# Compiler le modèlemodel.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
# Charger vos données d'entraînement et de validation# train_data, train_labels, val_data, val_labels = ...
# Entraîner le modèlemodel.fit(train_data, train_labels, epochs=10, validation_data=(val_data, val_labels))
2. Remplacement des couches supérieures
Le remplacement des couches supérieures consiste à remplacer les couches supérieures du modèle pré-entraîné par de nouvelles couches adaptées à la nouvelle tâche. Les couches inférieures du modèle pré-entraîné sont généralement gelées (non entraînables).
Exemple de remplacement des couches supérieures
import tensorflow as tffrom tensorflow.keras.applications import VGG16from tensorflow.keras.models import Modelfrom tensorflow.keras.layers import Dense, Flatten
# Charger le modèle VGG16 pré-entraîné sans les couches supérieuresbase_model = VGG16(weights='imagenet', include_top=False, input_shape=(224, 224, 3))
# Ajouter de nouvelles couches supérieures pour la nouvelle tâchex = base_model.outputx = Flatten()(x)x = Dense(256, activation='relu')(x)predictions = Dense(2, activation='softmax')(x)
# Créer le modèle finalmodel = Model(inputs=base_model.input, outputs=predictions)
# Geler les couches du modèle pré-entraînéfor layer in base_model.layers: layer.trainable = False
# Compiler le modèlemodel.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
# Charger vos données d'entraînement et de validation# train_data, train_labels, val_data, val_labels = ...
# Entraîner le modèlemodel.fit(train_data, train_labels, epochs=10, validation_data=(val_data, val_labels))
3. Entraînement progressif
L’entraînement progressif consiste à entraîner d’abord les couches supérieures du modèle tout en gelant les couches inférieures, puis à dégeler progressivement les couches inférieures et à les entraîner avec un taux d’apprentissage plus faible.
Exemple d’entraînement progressif
import tensorflow as tffrom tensorflow.keras.applications import VGG16from tensorflow.keras.models import Modelfrom tensorflow.keras.layers import Dense, Flatten
# Charger le modèle VGG16 pré-entraîné sans les couches supérieuresbase_model = VGG16(weights='imagenet', include_top=False, input_shape=(224, 224, 3))
# Ajouter des couches supérieures pour la nouvelle tâchex = base_model.outputx = Flatten()(x)x = Dense(256, activation='relu')(x)predictions = Dense(2, activation='softmax')(x)
# Créer le modèle finalmodel = Model(inputs=base_model.input, outputs=predictions)
# Geler les couches du modèle pré-entraînéfor layer in base_model.layers: layer.trainable = False
# Compiler le modèlemodel.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
# Charger vos données d'entraînement et de validation# train_data, train_labels, val_data, val_labels = ...
# Entraîner les couches supérieuresmodel.fit(train_data, train_labels, epochs=10, validation_data=(val_data, val_labels))
# Décongeler les couches inférieures et les entraîner avec un taux d'apprentissage plus faiblefor layer in base_model.layers: layer.trainable = True
model.compile(optimizer=tf.keras.optimizers.Adam(1e-5), loss='categorical_crossentropy', metrics=['accuracy'])
# Entraîner le modèle completmodel.fit(train_data, train_labels, epochs=10, validation_data=(val_data, val_labels))
Conclusion
L’apprentissage par transfert offre plusieurs options de conception pour adapter un modèle pré-entraîné à une nouvelle tâche. Ces options incluent le fine-tuning, l’extraction de caractéristiques, le remplacement des couches supérieures et l’entraînement progressif. Chaque option a ses propres avantages et peut être choisie en fonction des besoins spécifiques de la tâche et des données disponibles. En utilisant ces techniques, vous pouvez tirer parti des connaissances apprises par le modèle pré-entraîné pour améliorer les performances sur la nouvelle tâche, même avec des jeux de données plus petits.