Transformation des données PyTorch
Dans PyTorch, la transformation de données est un mécanisme de traitement des données lors du chargement des données, qui convertit les données brutes en un format adapté à l'entraînement du modèle, principalement au moyen des outils fournis par torchvision.transforms.
Les transformations de données peuvent non seulement mettre en œuvre un prétraitement de base des données (comme la normalisation, le redimensionnement, etc.), mais aussi aider à l'augmentation des données (comme le recadrage aléatoire, le retournement, etc.), améliorant ainsi la capacité de généralisation du modèle.
Pourquoi les transformations de données sont-elles nécessaires ?
Prétraitement des données:
- Ajuster le format, la taille et la plage des données pour les rendre adaptées à l'entrée du modèle.
- Par exemple, les images doivent être redimensionnées à une taille fixe, converties au format tenseur et normalisées dans [0,1].
Augmentation de données:
- Transformer les données pendant l'entraînement pour augmenter la diversité.
- Par exemple, augmenter la variété des échantillons de données par rotation aléatoire, retournement et recadrage afin d'éviter le surapprentissage.
Flexibilité:
- En définissant une série d'opérations de transformation, les données peuvent être traitées dynamiquement, ce qui simplifie la complexité du chargement des données.
Dans PyTorch, le module torchvision.transforms fournit une variété d'opérations de transformation pour le traitement d'images.
Opérations de transformation de base
| Nom de la fonction de transformation | Description | Exemple |
|---|---|---|
| transforms.ToTensor() | Convertit une image PIL ou un tableau NumPy en un tenseur PyTorch, et normalise automatiquement les valeurs de pixel dans [0, 1]. | transform = transforms.ToTensor() |
| transforms.Normalize(mean, std) | Normalise l'image de sorte que les données aient une moyenne nulle et une variance unitaire. | transform = transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) |
| transforms.Resize(size) | Redimensionne l'image afin de garantir une taille d'image cohérente pour l'entrée du réseau. | transform = transforms.Resize((256, 256)) |
| transforms.CenterCrop(size) | Recadre une région de taille spécifiée depuis le centre de l'image. | transform = transforms.CenterCrop(224) |
1、ToTensor
Convertit une image PIL ou un tableau NumPy en un tenseur PyTorch.
Normalise également les valeurs de pixel de [0, 255] à [0, 1].
from torchvision import transforms transform = transforms.ToTensor()
2、Normalize
Normalise les données pour qu'elles aient une moyenne et un écart-type spécifiques.
Couramment utilisé pour les données d'image, en normalisant ses valeurs de pixels pour avoir une moyenne nulle et une variance unitaire.
transform = transforms.Normalize(mean=[0.5], std=[0.5]) # 归一化到 [-1, 1]
3、Resize
Redimensionne l'image.
transform = transforms.Resize((128, 128)) # 将图像调整为 128x128
4、CenterCrop
Recadre une région de taille spécifiée depuis le centre de l'image.
transform = transforms.CenterCrop(128) # 裁剪 128x128 的区域
Opérations d'augmentation de données
| Nom de la fonction de transformation | Description | Exemple |
|---|---|---|
| transforms.RandomHorizontalFlip(p) | Retourne aléatoirement l'image horizontalement. | transform = transforms.RandomHorizontalFlip(p=0.5) |
| transforms.RandomRotation(degrees) | Effectue une rotation aléatoire de l'image. | transform = transforms.RandomRotation(degrees=45) |
| transforms.ColorJitter(brightness, contrast, saturation, hue) | Ajuste la luminosité, le contraste, la saturation et la teinte de l'image. | transform = transforms.ColorJitter(brightness=0.2, contrast=0.2, saturation=0.2, hue=0.1) |
| transforms.RandomCrop(size) | Recadre aléatoirement une région de taille spécifiée. | transform = transforms.RandomCrop(224) |
| transforms.RandomResizedCrop(size) | Recadre aléatoirement l'image et la redimensionne à la taille spécifiée. | transform = transforms.RandomResizedCrop(224) |
1、RandomCrop
Recadre aléatoirement une zone de taille spécifiée à partir de l'image.
transform = transforms.RandomCrop(128)
2、RandomHorizontalFlip
Effectue un retournement horizontal de l'image avec une certaine probabilité.
transform = transforms.RandomHorizontalFlip(p=0.5) # 50% 概率翻转
3、RandomRotation
Effectue une rotation d'un angle aléatoire.
transform = transforms.RandomRotation(degrees=30) # 随机旋转 -30 到 +30 度
4、ColorJitter
Modifie aléatoirement la luminosité, le contraste, la saturation ou la teinte de l'image.
transform = transforms.ColorJitter(brightness=0.5, contrast=0.5)
Composition des transformations
| Nom de la fonction de transformation | Description | Exemple |
|---|---|---|
| transforms.Compose() | Combine plusieurs transformations ensemble et les applique séquentiellement dans l'ordre. | transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]), transforms.Resize((256, 256))]) |
Combinez plusieurs transformations à l'aide de transforms.Compose.
transform = transforms.Compose([
transforms.Resize((128, 128)),
transforms.RandomHorizontalFlip(p=0.5),
transforms.ToTensor(),
transforms.Normalize(mean=[0.5], std=[0.5])
])
Transformations personnalisées
Si les fonctionnalités fournies par transforms ne permettent pas de répondre aux besoins, elles peuvent être implémentées au moyen de classes ou de fonctions personnalisées.
Exemple
def __call__(self, x):
# Toute logique de transformation peut être personnalisée ici
return x * 2
transform = CustomTransform()
Exemple
Application de transformations aux jeux de données d'images
Chargez le jeu de données MNIST et appliquez des transformations.
Exemple
from torch.utils.data import DataLoader
# Définir les transformations
transform = transforms.Compose([
transforms.Resize((128, 128)),
transforms.ToTensor(),
transforms.Normalize(mean=[0.5], std=[0.5])
])
# Charger le jeu de données
train_dataset = datasets.MNIST(root='./data', train=True, transform=transform, download=True)
# Utiliser DataLoader
train_loader = DataLoader(dataset=train_dataset, batch_size=32, shuffle=True)
# Afficher les données transformées
for images, labels in train_loader:
print("Taille du tenseur d'image :", images.size()) # [batch_size, 1, 128, 128]
break
Le résultat de sortie est:
图像张量大小: torch.Size([32, 1, 128, 128])
Visualisation des effets de transformation
Le code suivant montre une comparaison entre les données originales et les données transformées.
Exemple
from torchvision import datasets
from torchvision import datasets, transforms
# Visualisation des images originales et augmentées
transform_augment = transforms.Compose([
transforms.RandomHorizontalFlip(),
transforms.RandomRotation(30),
transforms.ToTensor()
])
# Charger le jeu de données
dataset = datasets.MNIST(root='./data', train=True, download=True, transform=transform_augment)
# Afficher les images
def show_images(dataset):
fig, axs = plt.subplots(1, 5, figsize=(15, 5))
for i in range(5):
image, label = dataset[i]
axs[i].imshow(image.squeeze(0), cmap='gray') # Convertir (1, H, W) en (H, W)
axs[i].set_title(f"Étiquette : {label}")
axs[i].axis('off')
plt.show()
show_images(dataset)
L'affichage est le suivant :
