diff --git a/Train-Models.md b/Train-Models.md index 615c32aba..65623a4cf 100644 --- a/Train-Models.md +++ b/Train-Models.md @@ -23,13 +23,23 @@ Nous utilisons le **dossier `Training`** du dataset Fruits 360, contenant des im - **Pourquoi ce split ?** Il permet de s’assurer que le modèle peut bien généraliser sur des données non vues. #### **Commandes pour Préparer le Dataset** -```bash -# Clone du repo et déplacement dans le répertoire -git clone https://github.com/fruits-360/fruits-360-100x100.git -cd fruits-360-100x100 -# Split du dataset -python scripts/split_data.py --input_dir Training --split_ratio 0.25 +```python +def load_data(data_dir, validation_split=0.25, seed=1337, image_size=(100, 100), batch_size=128, label_mode='int'): + """Load and split the data into training and validation sets.""" + logging.info(f"Loading data from {data_dir}") + train_ds, val_ds = keras.utils.image_dataset_from_directory( + data_dir, + validation_split=validation_split, + subset="both", + seed=seed, + image_size=image_size, + batch_size=batch_size, + label_mode=label_mode + ) + return train_ds, val_ds +# Load data +train_ds, val_ds = load_data("data/Training") ``` --- @@ -39,24 +49,21 @@ Pour **enrichir le dataset** et éviter l’overfitting, nous avons appliqué de **Transformations appliquées :** - **Rotation** aléatoire entre -15° et +15° - **Flip horizontal** -- **Modification de la luminosité et du contraste** +- **Modification de la luminosité et du contraste** + #### **Extrait de Code : Data Augmentation** ```python import albumentations as A -from albumentations.core.composition import OneOf -from albumentations.pytorch import ToTensorV2 # Définition de l'augmentation -transform = A.Compose([ - A.RandomRotate90(), - A.Flip(), - A.OneOf([ - A.RandomBrightnessContrast(), - A.HueSaturationValue(), - ], p=0.5), - ToTensorV2(), -]) +transforms = [ + A.RandomRotate90(p=1.0), + A.Transpose(p=1.0), + A.VerticalFlip(p=1.0), + A.HorizontalFlip(p=1.0), + A.RandomBrightnessContrast(brightness_limit=0.5, contrast_limit=0.5, p=1.0), + ] ``` **Pourquoi utiliser Albumentations ?** @@ -107,10 +114,25 @@ Nous avons testé 4 architectures : **Code : Initialisation des Modèles Pré-entrainés** ```python -from tensorflow.keras.applications import ResNet50, VGG16, EfficientNetB0 - -model = ResNet50(weights='imagenet', input_shape=(100, 100, 3), include_top=False) -model.trainable = True # Fine-tuning +def create_efficientnet_model(num_classes): + """Create an EfficientNet model.""" + logging.info("Creating EfficientNet model") + base_model = EfficientNetB0(weights='imagenet', include_top=False, input_shape=(100, 100, 3)) + base_model.trainable = False + + model = keras.Sequential([ + base_model, + layers.GlobalAveragePooling2D(name='global_avg_pooling'), + layers.Dense(num_classes*3, activation='relu', name='dense_1'), + layers.BatchNormalization(name='batch_norm_1'), + layers.Dropout(0.2, name='dropout_1'), + layers.Dense(num_classes*2, activation='relu', name='dense_2'), + layers.BatchNormalization(name='batch_norm_2'), + layers.Dropout(0.2, name='dropout_2'), + layers.Dense(num_classes, activation='softmax', name='output_layer') + ]) + return model +create_efficientnet_model(num_classes) ``` --- @@ -120,14 +142,15 @@ Nous avons utilisé un **callback Keras** pour enregistrer uniquement le **meill #### **Extrait de Code : Callback** ```python -from tensorflow.keras.callbacks import ModelCheckpoint - -checkpoint = ModelCheckpoint( - 'best_model.keras', - monitor='val_accuracy', - save_best_only=True, - mode='max' -) +imoort keras +logging.info(f"Training {model_name} model") +callbacks = [ + keras.callbacks.ModelCheckpoint( + f"models/best_model_{model_name}.keras", save_best_only=True, monitor="val_acc", mode="max" + ), + keras.callbacks.EarlyStopping(monitor='val_acc', patience=patience, mode="max", restore_best_weights=True), + keras.callbacks.CSVLogger(f'artefacts/training_log_{model_name}.csv') +] ``` **Pourquoi utiliser un callback ?** @@ -170,8 +193,8 @@ print(f"F1: {f1}, AUC: {auc}, Precision: {precision}, Recall: {recall}") Pour reproduire l’entraînement : 1. **Cloner le repo :** ```bash - git clone <url_du_repo> - cd <nom_du_repo> + git https://github.com/abrahamkoloboe27/Machine-Learning-En-Production-LinkedIn.git /data + cd data ``` 2. **Installer les dépendances :** ```bash @@ -179,7 +202,7 @@ Pour reproduire l’entraînement : ``` 3. **Lancer l’entraînement :** ```bash - python train_model.py + python main.py ``` ---