| import torch |
| import argparse |
| from utils import prep |
| from models.cnn import IntelCNN_PyTorch |
| from models.train import Trainer |
|
|
|
|
| def parse_args(): |
| parser = argparse.ArgumentParser(description="Entraînement d'un modèle CNN") |
| parser.add_argument('--framework', type=str, choices=['pytorch', 'tensorflow'], |
| default='pytorch', help="Framework à utiliser (default: pytorch)") |
| parser.add_argument('--epochs', type=int, default=20, |
| help="Nombre d'époques d'entraînement") |
| parser.add_argument('--lr', type=float, default=0.001, help="Learning rate") |
| parser.add_argument('--wd', type=float, default=0.0001, help="Weight decay") |
| parser.add_argument('--mode', type=str, choices=['train', 'eval'], default='train', |
| help="Mode : 'train' ou 'eval' (default: train)") |
| parser.add_argument('--cuda', action='store_true', help="Utiliser le GPU si disponible") |
| parser.add_argument('--debug', action='store_true', help="Mode debug") |
| return parser.parse_args() |
|
|
|
|
| def main(): |
| args = parse_args() |
| if args.framework == 'tensorflow': |
| run_tensorflow(args) |
| else: |
| run_pytorch(args) |
|
|
|
|
| def run_pytorch(args): |
| import random |
| import numpy as np |
| from torch.utils.data import random_split, DataLoader |
|
|
| torch.manual_seed(42) |
| np.random.seed(42) |
| random.seed(42) |
|
|
| device = torch.device("cuda" if args.cuda and torch.cuda.is_available() else "cpu") |
| print(f"[PyTorch] Device: {device}") |
|
|
| train_dataloader, test_dataloader = prep.get_data() |
|
|
| dataset = train_dataloader.dataset |
|
|
| train_size = int(0.8 * len(dataset)) |
| val_size = len(dataset) - train_size |
| train_dataset, val_dataset = random_split(dataset,[train_size, val_size],generator=torch.Generator().manual_seed(42)) |
| train_dataloader = DataLoader(train_dataset,batch_size=train_dataloader.batch_size,shuffle=True,num_workers=4,pin_memory=True) |
| val_dataloader = DataLoader(val_dataset,batch_size=train_dataloader.batch_size,shuffle=False,num_workers=4,pin_memory=True) |
| if args.debug: |
| print(f"Train size: {len(train_dataset)} | Val size: {len(val_dataset)}") |
|
|
| model = IntelCNN_PyTorch().to(device) |
| if args.mode == 'eval': |
| model.load_state_dict(torch.load("geraud_model.pth", map_location=device)) |
| print("Model loaded from geraud_model.pth") |
|
|
| trainer = Trainer(model,train_dataloader,val_dataloader,test_dataloader,args.lr,args.wd,args.epochs,device) |
| if args.mode == 'train': |
| trainer.train(save=True, plot=True) |
|
|
| trainer.test() |
|
|
| def run_tensorflow(args): |
| import tensorflow as tf |
| from tensorflow.keras import layers, callbacks |
| from models.cnn import get_tensorflow_model |
|
|
| print(f"[TensorFlow] GPUs: {tf.config.list_physical_devices('GPU')}") |
|
|
| IMG_SIZE = 150 |
| BATCH = 32 |
| DATA_DIR = '/kaggle/input/datasets/puneet6060/intel-image-classification/seg_train/seg_train' |
| VAL_DIR = '/kaggle/input/datasets/puneet6060/intel-image-classification/seg_test/seg_test' |
| AUTOTUNE = tf.data.AUTOTUNE |
|
|
| norm = layers.Rescaling(1./255) |
| augment = tf.keras.Sequential([layers.RandomFlip("horizontal"),layers.RandomRotation(0.15),layers.RandomZoom(0.15),layers.RandomBrightness(0.2),layers.RandomContrast(0.2),]) |
|
|
| train_ds = tf.keras.utils.image_dataset_from_directory(DATA_DIR,image_size=(IMG_SIZE, IMG_SIZE),batch_size=BATCH) |
| val_ds = tf.keras.utils.image_dataset_from_directory(VAL_DIR,image_size=(IMG_SIZE, IMG_SIZE),batch_size=BATCH,shuffle=False) |
| train_ds = train_ds.map(lambda x, y: (norm(augment(x, training=True)), y),num_parallel_calls=AUTOTUNE).prefetch(AUTOTUNE) |
| val_ds = val_ds.map(lambda x, y: (norm(x), y),num_parallel_calls=AUTOTUNE).prefetch(AUTOTUNE) |
|
|
| model = get_tensorflow_model(IMG_SIZE) |
| if args.mode == 'eval': |
| model = tf.keras.models.load_model("geraud_model.keras") |
| print("Model loaded from geraud_model.keras") |
|
|
| else: |
| model.summary() |
| model.compile(optimizer=tf.keras.optimizers.Adam(args.lr),loss='sparse_categorical_crossentropy',metrics=['accuracy']) |
| cb = [callbacks.ModelCheckpoint('geraud_model.keras',save_best_only=True,monitor='val_accuracy',verbose=1), |
| callbacks.ReduceLROnPlateau(monitor='val_loss',factor=0.5,patience=3,verbose=1), |
| callbacks.EarlyStopping(monitor='val_loss',patience=10,restore_best_weights=True,verbose=1),] |
| model.fit(train_ds,validation_data=val_ds,epochs=args.epochs,callbacks=cb) |
| print("Model saved to geraud_model.keras") |
|
|
| loss, acc = model.evaluate(val_ds, verbose=1) |
| print(f"\nTest Accuracy: {acc*100:.2f}% | Test Loss: {loss:.4f}") |
|
|
| if __name__ == '__main__': |
| main() |
|
|