Python & Intelligence Artificielle

Les outils essentiels pour créer et entraîner des réseaux de neurones

Pourquoi Python pour l'IA ?

Python est devenu le langage de prédilection pour l'Intelligence Artificielle et le Machine Learning. Sa syntaxe claire, son écosystème riche et sa communauté active en font l'outil idéal pour développer des modèles d'IA.

📚

Bibliothèques Riches

NumPy, Pandas, TensorFlow, PyTorch, Scikit-learn...

🎯

Syntaxe Simple

Code lisible et expressif, idéal pour le prototypage rapide

🌍

Communauté Active

Millions de développeurs, tutoriels, et support

Performance

Backends optimisés en C/C++, support GPU

Les Fondations : NumPy et Pandas

🔢 NumPy

La Base du Calcul Numérique

NumPy (Numerical Python) est la bibliothèque fondamentale pour le calcul scientifique en Python. Elle fournit des tableaux multidimensionnels efficaces et des opérations mathématiques vectorisées.

Pourquoi NumPy est Essentiel :

  • Performance : 10-100× plus rapide que les listes Python
  • Vectorisation : Opérations sur des tableaux entiers en une ligne
  • Fondation : Base de toutes les bibliothèques d'IA (TensorFlow, PyTorch)
  • Broadcasting : Opérations intelligentes entre tableaux de tailles différentes
Exemples NumPy
import numpy as np

# Création de tableaux
array = np.array([1, 2, 3, 4, 5])
matrix = np.array([[1, 2, 3], [4, 5, 6]])

# Opérations vectorisées (très rapides !)
result = array * 2  # [2, 4, 6, 8, 10]
squared = array ** 2  # [1, 4, 9, 16, 25]

# Statistiques
mean = np.mean(array)  # 3.0
std = np.std(array)    # 1.414

# Algèbre linéaire
dot_product = np.dot(array, array)  # 55
matrix_mult = np.matmul(matrix, matrix.T)

# Génération de données
random_data = np.random.randn(1000, 10)  # 1000 samples, 10 features
zeros = np.zeros((3, 3))
ones = np.ones((2, 4))

# Reshaping (crucial pour les réseaux de neurones)
reshaped = array.reshape(5, 1)
flattened = matrix.flatten()  # [1, 2, 3, 4, 5, 6]

Utilisation en Deep Learning :

  • Prétraitement des données (normalisation, standardisation)
  • Manipulation de tenseurs (images, séquences)
  • Calculs mathématiques (activations, gradients)
  • Génération de données synthétiques

🐼 Pandas

Manipulation de Données Tabulaires

Pandas est la bibliothèque incontournable pour la manipulation et l'analyse de données structurées. Elle fournit des structures de données puissantes (DataFrame, Series) et des outils pour nettoyer, transformer et analyser les données.

Pourquoi Pandas est Crucial :

  • DataFrames : Tables structurées comme Excel/SQL
  • Nettoyage : Gestion des valeurs manquantes, duplicatas
  • Transformation : Filtres, groupements, agrégations
  • I/O : Lecture/écriture CSV, Excel, SQL, JSON
Exemples Pandas
import pandas as pd
import numpy as np

# Création d'un DataFrame
data = {
    'nom': ['Alice', 'Bob', 'Charlie', 'David'],
    'age': [25, 30, 35, 28],
    'salaire': [50000, 60000, 75000, 55000]
}
df = pd.DataFrame(data)

# Lecture de fichiers
df = pd.read_csv('data.csv')
df = pd.read_excel('data.xlsx')

# Exploration rapide
print(df.head())        # 5 premières lignes
print(df.info())        # Types et valeurs manquantes
print(df.describe())    # Statistiques descriptives

# Sélection et filtrage
ages = df['age']        # Une colonne
filtered = df[df['age'] > 30]  # Filtre
subset = df[['nom', 'age']]     # Plusieurs colonnes

# Nettoyage de données
df.dropna()             # Supprimer valeurs manquantes
df.fillna(0)            # Remplir valeurs manquantes
df.drop_duplicates()    # Supprimer duplicatas

# Transformation
df['age_squared'] = df['age'] ** 2
df['salaire_norm'] = (df['salaire'] - df['salaire'].mean()) / df['salaire'].std()

# Groupement et agrégation
grouped = df.groupby('age').mean()
pivot = df.pivot_table(values='salaire', index='age', aggfunc='mean')

# Conversion pour ML
X = df[['age', 'salaire']].values  # Vers NumPy array
y = df['target'].values

Utilisation en Machine Learning :

  • Chargement et exploration des datasets
  • Nettoyage et préparation des données
  • Feature engineering (création de nouvelles variables)
  • Analyse exploratoire (EDA)

Les Frameworks de Deep Learning

Les frameworks de Deep Learning fournissent des abstractions de haut niveau pour créer, entraîner et déployer des réseaux de neurones. Voici les trois principaux :

🔶 TensorFlow

Google Brain 2015

Framework complet développé par Google, orienté production et déploiement. Utilisé massivement dans l'industrie.

Points Forts :

  • ✅ Écosystème complet (TensorBoard, TF Lite, TF Serving)
  • ✅ Excellent pour la production
  • ✅ Support mobile et embarqué
  • ✅ TensorBoard pour la visualisation
  • ✅ Grande communauté et documentation

Points Faibles :

  • ❌ Courbe d'apprentissage plus raide
  • ❌ API parfois complexe
  • ❌ Debugging plus difficile
Popularité :
90%

🔥 PyTorch

Meta (Facebook) 2016

Framework favori de la recherche, dynamique et pythonique. Intuition et flexibilité.

Points Forts :

  • ✅ Très pythonique et intuitif
  • ✅ Graphes dynamiques (define-by-run)
  • ✅ Debugging facile (comme du Python normal)
  • ✅ Dominant en recherche académique
  • ✅ TorchScript pour l'export

Points Faibles :

  • ❌ Écosystème de déploiement moins mature
  • ❌ Moins d'outils prêts pour la production
Popularité :
95%

🎨 Keras

François Chollet 2015

API de haut niveau, simple et élégante. Intégrée à TensorFlow depuis la v2. Parfaite pour débuter.

Points Forts :

  • ✅ Extrêmement simple et intuitive
  • ✅ Prototypage ultra-rapide
  • ✅ Excellente pour apprendre
  • ✅ Code minimal, résultats rapides
  • ✅ Backend TensorFlow

Points Faibles :

  • ❌ Moins de contrôle bas niveau
  • ❌ Moins flexible pour architectures custom
Popularité :
75%

Comparaison Rapide

Critère TensorFlow PyTorch Keras
Facilité d'apprentissage ⭐⭐⭐ ⭐⭐⭐⭐ ⭐⭐⭐⭐⭐
Flexibilité ⭐⭐⭐⭐ ⭐⭐⭐⭐⭐ ⭐⭐⭐
Production ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐ ⭐⭐⭐⭐
Recherche ⭐⭐⭐⭐ ⭐⭐⭐⭐⭐ ⭐⭐⭐
Communauté ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐
Documentation ⭐⭐⭐⭐ ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐⭐

Exemples Pratiques avec Keras

Keras permet de créer des réseaux de neurones en quelques lignes de code. Voici des exemples concrets pour différentes tâches.

1️⃣ Réseau Dense Simple (Classification)

Classificateur binaire basique : 3 couches denses pour prédire une classe.

Classification Binaire
from tensorflow import keras
from tensorflow.keras import layers

# Créer le modèle
model = keras.Sequential([
    layers.Dense(64, activation='relu', input_shape=(10,)),
    layers.Dropout(0.5),
    layers.Dense(32, activation='relu'),
    layers.Dense(1, activation='sigmoid')
])

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

# Entraîner
history = model.fit(
    X_train, y_train,
    epochs=50,
    batch_size=32,
    validation_split=0.2
)

# Prédire
predictions = model.predict(X_test)
Explication :
  • 64 neurones → ReLU + Dropout (évite surapprentissage)
  • 32 neurones → ReLU
  • 1 neurone de sortie → Sigmoid (probabilité 0-1)
  • Loss binary_crossentropy pour classification binaire

2️⃣ CNN pour Images (MNIST)

Réseau convolutif pour classifier des chiffres manuscrits.

Convolutional Neural Network
from tensorflow.keras import layers, models

# Créer CNN
model = models.Sequential([
    # Bloc convolutif 1
    layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)),
    layers.MaxPooling2D((2, 2)),

    # Bloc convolutif 2
    layers.Conv2D(64, (3, 3), activation='relu'),
    layers.MaxPooling2D((2, 2)),

    # Bloc convolutif 3
    layers.Conv2D(64, (3, 3), activation='relu'),

    # Classification
    layers.Flatten(),
    layers.Dense(64, activation='relu'),
    layers.Dense(10, activation='softmax')  # 10 classes (0-9)
])

model.compile(
    optimizer='adam',
    loss='sparse_categorical_crossentropy',
    metrics=['accuracy']
)

# Entraîner
model.fit(X_train, y_train, epochs=10, validation_data=(X_val, y_val))
Explication :
  • Conv2D extrait les features visuelles
  • MaxPooling réduit la dimensionnalité
  • Flatten convertit 2D → 1D
  • Softmax donne probabilités pour 10 classes

3️⃣ RNN pour Séquences (LSTM)

Réseau récurrent pour analyser des séquences temporelles.

LSTM pour Time Series
from tensorflow.keras import layers, models

# Créer LSTM
model = models.Sequential([
    layers.LSTM(128, return_sequences=True, input_shape=(100, 10)),
    layers.Dropout(0.2),
    layers.LSTM(64),
    layers.Dropout(0.2),
    layers.Dense(32, activation='relu'),
    layers.Dense(1)  # Prédiction continue
])

model.compile(
    optimizer='adam',
    loss='mse',  # Mean Squared Error pour régression
    metrics=['mae']  # Mean Absolute Error
)

model.fit(X_train, y_train, epochs=50, batch_size=64)
Explication :
  • LSTM capture dépendances temporelles
  • return_sequences=True pour empiler LSTMs
  • Dropout régularise le modèle
  • MSE loss pour prédictions continues

4️⃣ Transfer Learning (VGG16)

Utiliser un modèle pré-entraîné pour une nouvelle tâche.

Transfer Learning
from tensorflow.keras.applications import VGG16
from tensorflow.keras import layers, models

# Charger VGG16 pré-entraîné (sans la couche de classification)
base_model = VGG16(
    weights='imagenet',
    include_top=False,
    input_shape=(224, 224, 3)
)

# Geler les poids pré-entraînés
base_model.trainable = False

# Ajouter nos propres couches
model = models.Sequential([
    base_model,
    layers.GlobalAveragePooling2D(),
    layers.Dense(256, activation='relu'),
    layers.Dropout(0.5),
    layers.Dense(5, activation='softmax')  # 5 classes custom
])

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

model.fit(X_train, y_train, epochs=10)
Explication :
  • VGG16 déjà entraîné sur ImageNet
  • Geler les poids pour garder les features
  • Ajouter couches custom pour notre tâche
  • Beaucoup plus rapide que entraîner from scratch

5️⃣ Autoencoder (Réduction de Dimension)

Encoder-Decoder pour compresser et reconstruire des données.

Autoencoder
from tensorflow.keras import layers, models

# Dimension de l'espace latent
encoding_dim = 32

# Encoder
encoder = models.Sequential([
    layers.Dense(128, activation='relu', input_shape=(784,)),
    layers.Dense(64, activation='relu'),
    layers.Dense(encoding_dim, activation='relu')
])

# Decoder
decoder = models.Sequential([
    layers.Dense(64, activation='relu', input_shape=(encoding_dim,)),
    layers.Dense(128, activation='relu'),
    layers.Dense(784, activation='sigmoid')
])

# Autoencoder complet
autoencoder = models.Sequential([encoder, decoder])

autoencoder.compile(optimizer='adam', loss='binary_crossentropy')

# Entraîner à reconstruire l'entrée
autoencoder.fit(X_train, X_train, epochs=50, batch_size=256)

# Utiliser l'encoder pour réduire la dimension
encoded_data = encoder.predict(X_test)
Explication :
  • Encoder compresse 784 → 32 dimensions
  • Decoder reconstruit 32 → 784 dimensions
  • Le modèle apprend une représentation compacte
  • Utile pour compression, débruitage, anomalies

6️⃣ GAN Simple (Generative Adversarial Network)

Générateur et Discriminateur s'affrontent pour créer des données réalistes.

Simple GAN
from tensorflow.keras import layers, models

# Générateur
generator = models.Sequential([
    layers.Dense(256, activation='relu', input_shape=(100,)),
    layers.BatchNormalization(),
    layers.Dense(512, activation='relu'),
    layers.BatchNormalization(),
    layers.Dense(784, activation='tanh')
])

# Discriminateur
discriminator = models.Sequential([
    layers.Dense(512, activation='relu', input_shape=(784,)),
    layers.Dropout(0.3),
    layers.Dense(256, activation='relu'),
    layers.Dropout(0.3),
    layers.Dense(1, activation='sigmoid')
])

discriminator.compile(optimizer='adam', loss='binary_crossentropy')

# GAN complet (générateur + discriminateur gelé)
discriminator.trainable = False
gan = models.Sequential([generator, discriminator])
gan.compile(optimizer='adam', loss='binary_crossentropy')

# Boucle d'entraînement alternée
for epoch in range(epochs):
    # 1. Entraîner discriminateur
    noise = np.random.normal(0, 1, (batch_size, 100))
    fake_images = generator.predict(noise)
    real_images = X_train[np.random.randint(0, X_train.shape[0], batch_size)]

    d_loss_real = discriminator.train_on_batch(real_images, np.ones((batch_size, 1)))
    d_loss_fake = discriminator.train_on_batch(fake_images, np.zeros((batch_size, 1)))

    # 2. Entraîner générateur
    noise = np.random.normal(0, 1, (batch_size, 100))
    g_loss = gan.train_on_batch(noise, np.ones((batch_size, 1)))
Explication :
  • Générateur crée de fausses images depuis bruit
  • Discriminateur distingue vrai/faux
  • Entraînement alterné : adversarial game
  • Générateur devient meilleur pour tromper

Outils Complémentaires Essentiels

📊 Matplotlib & Seaborn

Visualisation de Données

Créer des graphiques pour analyser les données et visualiser les résultats.

import matplotlib.pyplot as plt
import seaborn as sns

# Visualiser l'historique d'entraînement
plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.title('Model Loss')
plt.legend(['train', 'validation'])
plt.show()

# Matrice de confusion
sns.heatmap(confusion_matrix, annot=True)

🔬 Scikit-learn

Machine Learning Classique

Algorithmes ML traditionnels, preprocessing, métriques d'évaluation.

from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import accuracy_score

# Split données
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42
)

# Normalisation
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)

🖼️ OpenCV

Traitement d'Images

Manipulation d'images, vidéo, détection de features pour vision par ordinateur.

import cv2

# Charger et redimensionner image
img = cv2.imread('image.jpg')
img_resized = cv2.resize(img, (224, 224))

# Convertir BGR → RGB
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

# Augmentation
img_rotated = cv2.rotate(img, cv2.ROTATE_90_CLOCKWISE)

🚀 Hugging Face Transformers

NLP & LLMs

Accès à des milliers de modèles pré-entraînés (BERT, GPT, T5...).

from transformers import pipeline

# Sentiment analysis en 2 lignes
classifier = pipeline('sentiment-analysis')
result = classifier("J'adore ce cours sur l'IA!")
# [{'label': 'POSITIVE', 'score': 0.9998}]

# Génération de texte
generator = pipeline('text-generation', model='gpt2')
text = generator("Python est", max_length=50)

⚡ JAX

Computing Numérique Haute Performance

NumPy accéléré avec GPU/TPU, autodiff, compilation JIT.

import jax.numpy as jnp
from jax import grad, jit

# Fonction à optimiser
def loss(params, x, y):
    return jnp.mean((params * x - y) ** 2)

# Gradient automatique
grad_fn = grad(loss)

# Compilation JIT pour vitesse
@jit
def fast_function(x):
    return jnp.sum(x ** 2)

📈 Weights & Biases / TensorBoard

Suivi d'Expériences

Traquer métriques, hyperparamètres, visualiser l'entraînement.

import wandb

# Initialiser
wandb.init(project="mon-projet")

# Logger métriques
wandb.log({
    "loss": loss,
    "accuracy": acc,
    "epoch": epoch
})

# Pour TensorBoard avec Keras
tensorboard = keras.callbacks.TensorBoard(log_dir='./logs')
model.fit(X, y, callbacks=[tensorboard])

Workflow Complet : De A à Z

1

📥 Chargement des Données

import pandas as pd
import numpy as np

# Charger
df = pd.read_csv('dataset.csv')

# Explorer
print(df.head())
print(df.info())
print(df.describe())
2

🧹 Nettoyage & Préparation

# Gérer valeurs manquantes
df = df.dropna()

# Encoder catégories
df = pd.get_dummies(df, columns=['category'])

# Séparer features/target
X = df.drop('target', axis=1).values
y = df['target'].values
3

✂️ Split Train/Test

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42
)
4

📊 Normalisation

from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
5

🏗️ Construction du Modèle

from tensorflow import keras

model = keras.Sequential([
    keras.layers.Dense(64, activation='relu'),
    keras.layers.Dropout(0.5),
    keras.layers.Dense(32, activation='relu'),
    keras.layers.Dense(1, activation='sigmoid')
])

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

🎯 Entraînement

history = model.fit(
    X_train, y_train,
    epochs=50,
    batch_size=32,
    validation_split=0.2,
    callbacks=[
        keras.callbacks.EarlyStopping(patience=5),
        keras.callbacks.ModelCheckpoint('best_model.h5')
    ]
)
7

📈 Évaluation

from sklearn.metrics import classification_report

# Prédictions
y_pred = (model.predict(X_test) > 0.5).astype(int)

# Métriques
print(classification_report(y_test, y_pred))

# Courbes
import matplotlib.pyplot as plt
plt.plot(history.history['accuracy'])
plt.plot(history.history['val_accuracy'])
plt.show()
8

💾 Sauvegarde & Déploiement

# Sauvegarder
model.save('my_model.h5')

# Charger
loaded_model = keras.models.load_model('my_model.h5')

# Prédire sur nouvelles données
new_prediction = loaded_model.predict(new_data)

Bonnes Pratiques & Conseils

💡

Commencer Simple

Débutez avec Keras et des modèles simples. Augmentez la complexité progressivement uniquement si nécessaire.

🔬

Expérimenter

Testez différentes architectures, hyperparamètres, fonctions d'activation. Utilisez W&B ou TensorBoard pour traquer vos expériences.

📊

Visualiser

Toujours visualiser vos données, les courbes d'entraînement, et les prédictions. Les graphiques révèlent souvent des problèmes cachés.

🎯

Validation

Utilisez toujours un ensemble de validation pour détecter le surapprentissage. Early stopping est votre ami !

🔄

Transfer Learning

Ne réinventez pas la roue. Utilisez des modèles pré-entraînés quand c'est possible, surtout pour la vision et le NLP.

📚

Documentation

Documentez votre code, vos expériences, et vos résultats. Votre futur vous (et vos collègues) vous remercieront.

Ressources pour Aller Plus Loin

🎓 Tutoriels & Cours

  • Coursera: Deep Learning Specialization (Andrew Ng)
  • Fast.ai: Practical Deep Learning
  • DeepLearning.AI: TensorFlow Developer
  • PyTorch Tutorials officiels
  • Kaggle Learn: Intro to Deep Learning

💻 Plateformes de Pratique

  • Kaggle: Compétitions et datasets
  • Google Colab: GPU gratuit dans le cloud
  • Paperspace Gradient: Notebooks ML
  • Hugging Face: Modèles pré-entraînés

📚 Livres Recommandés

  • "Deep Learning with Python" - François Chollet
  • "Hands-On Machine Learning" - Aurélien Géron
  • "Deep Learning" - Goodfellow, Bengio, Courville
  • "Python Data Science Handbook" - Jake VanderPlas

En Résumé

Python est l'écosystème le plus complet pour l'IA et le Machine Learning :

  • NumPy & Pandas : Les fondations pour manipuler les données
  • TensorFlow, PyTorch, Keras : Frameworks puissants pour le Deep Learning
  • Scikit-learn : ML classique et preprocessing
  • Écosystème riche : Matplotlib, OpenCV, Hugging Face...
  • Communauté active : Tutoriels, forums, support

Avec Keras, vous pouvez créer des réseaux de neurones sophistiqués en quelques lignes de code. Commencez simple, expérimentez, et progressez graduellement vers des architectures plus complexes.

L'important n'est pas de tout maîtriser dès le début, mais de pratiquer régulièrement et de construire des projets concrets !