self.conv1 = nn.Conv2d(1, 6, 3, padding=1)TD CNN
1 Applications directes
1.1 Exercice 1
On considère la couche convolutionnelle suivante:
- Quel est le nombre de canaux d’entrée ? Combien de filtres (convolutions) sont appliquées ?
- Quelle est la taille de la matrice de convolution ? Quel est le nombre de paramètres en incluant les biais ?
- Quelle est la taille de sortie d’une image \(50\times 50\) ?
Pour le pooling layer suivant:
nn.MaxPool2d(kernel_size = 2, stride = 2)- Quelle est la taille de sortie d’une image \(50\times 50\) ?
- Combien faut-il de couches pour arriver à une taille d’image inférieure ou égale à \(2\times2\) ?
1.2 Exercice 2
On considère ici le dataset d’exemple MNIST, que l’on peut charger avec les commandes suivantes:
import torchvision.transforms as transforms
import torchvision
transform = transforms.Compose([
transforms.ToTensor(), # Convertir en tenseur
transforms.Normalize((0.5,), (0.5,)) # Normalisation des images
])
train_data = torchvision.datasets.MNIST('.', train=True, download=True, transform=transform)
test_data = torchvision.datasets.MNIST('.', train=False, download=True, transform=transform)- Quelle est la taille des images du dataset ?
- Créer un modèle comprenant:
- une première couche de convolution, comprenant un unique filtre, avec un padding de 1
- une deuxième couche de pooling divisant la taille par 2
- une troisième couche de convolution, comprenant un unique filtre, avec un padding de 1
- une quatrième couche de pooling divisant la taille par 2
- une 5ème couche complètement connectée de taille 10
- une couche de sortie de taille 10
- Entraîner le modèle sur le dataset d’entraînement pendant 3 epochs.
- Calculer la précision sur l’ensemble de test à la fin de chaque epoch.
- Pour la couche 1 et 3, utiliser 6 filtres plutôt que 1. Cela améliore-t-il la précision ?
2 Approfondir
2.1 Exercice 3: CIFAR-10
Charger le dataset CIFAR-10 grâce à la commande:
import torch
import torchvision.transforms as transforms
from datasets import load_dataset
transform = transforms.Compose(
[transforms.ToTensor(),
transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])
# Téléchargement depuis Hugging Face (le serveur utilisé par
# torchvision.datasets.CIFAR10 est très lent)
cifar = load_dataset("uoft-cs/cifar10")
# Petit wrapper pour obtenir des paires (image, label) comme avec torchvision
class CIFAR10(torch.utils.data.Dataset):
def __init__(self, hf_dataset, transform=None):
self.data = hf_dataset
self.transform = transform
self.classes = hf_dataset.features["label"].names
def __len__(self):
return len(self.data)
def __getitem__(self, i):
exemple = self.data[i]
image, label = exemple["img"], exemple["label"]
if self.transform:
image = self.transform(image)
return image, label
trainset = CIFAR10(cifar["train"], transform=transform)
testset = CIFAR10(cifar["test"], transform=transform)- Quelle est la taille des images dans le dataset CIFAR-10 ?
- Divisez la taille du dataset d’entraînement par 10.
- Créez des modèles avec 2, 5 et 10 couches de convolutions. On ajustera le stride / pooling pour obtenir une image 1x1 à la fin de la convolution.
- Comparer les performances après 3 epochs sur le dataset de test.
3 Pour aller plus loin
3.1 Exercice 4
Reprendre le modèle de l’exercice 2.
- Afficher les filtres appris.
- Pour une image d’exemple, afficher les feature map (i.e. l’image transformée après chaque filtre).
3.2 Exercice 5
Lire et faire les exercices ici: https://d2l.ai/chapter_convolutional-modern/index.html