Skip to content

Servir les données au modèle : Dataset et DataLoader

Un Dataset PyTorch ne charge pas toutes les images en mémoire : c’est une recette qui explique comment fabriquer l’échantillon i à la demande, via deux méthodes.

class ShapesDataset(torch.utils.data.Dataset):
def __init__(self, raw_data):
self.raw_data = raw_data
def __len__(self):
return len(self.raw_data)
def __getitem__(self, idx):
img, boxes, labels = self.raw_data[idx]
image_tensor = F.to_tensor(img)
target = {
"boxes": torch.as_tensor(boxes, dtype=torch.float32),
"labels": torch.as_tensor(labels + 1, dtype=torch.int64), # +1 : 0 = fond
}
return image_tensor, target

Notez le +1 sur les labels : torchvision réserve par convention l’indice 0 à la classe fond (l’absence d’objet) — un décalage à retenir, sans quoi le modèle confondrait la classe « cercle » avec l’arrière-plan.

Pourquoi un DataLoader standard ne suffit pas

Section titled “Pourquoi un DataLoader standard ne suffit pas”

DataLoader tire des indices, appelle la recette du Dataset, puis empile les résultats en un batch. Ce dernier empilement suppose que tous les éléments ont la même forme — vrai pour une image seule, mais faux ici : une image peut contenir 2 pièces, une autre 4, et empiler des tenseurs de tailles différentes est impossible.

def collate_fn(batch):
return tuple(zip(*batch))
loader = torch.utils.data.DataLoader(
dataset, batch_size=4, shuffle=True, collate_fn=collate_fn
)

collate_fn personnalisé remplace l’empilement automatique par un simple regroupement en listes parallèles (tuple(zip(*batch)) transforme une liste de paires (image, target) en deux listes séparées) — le modèle Faster R-CNN de torchvision est justement conçu pour accepter des listes d’images de tailles variables plutôt qu’un unique tenseur empilé.

👉 Le fine-tuning ciblé


Junior TSAFACK – 12/09/2026