Tutoriel PyTorch

Rรฉsumรฉ du didacticiel Pytorch

Dans ce didacticiel pytorch, vous apprendrez tous les concepts ร  partir de zรฉro. Ce didacticiel couvre des sujets de base ร  avancรฉs tels que la dรฉfinition de pytorch, les avantages et les inconvรฉnients de pytorch, la comparaison, l'installation, le framework pytorch, la rรฉgression et la classification d'images. Ce tutoriel pytorch est absolument gratuit.

Qu'est-ce que PyTorch ?

PyTorch est une bibliothรจque open source d'apprentissage automatique basรฉe sur Torch pour le traitement du langage naturel ร  l'aide de Python. Il est similaire ร  NumPy mais avec un puissant support GPU. Il propose des graphiques informatiques dynamiques que vous pouvez modifier en dรฉplacement ร  l'aide d'Autograd. PyTorch est รฉgalement plus rapide que certains autres frameworks. Il a รฉtรฉ dรฉveloppรฉ par l'IA Research Group de Facebook en 2016.

Avantages et inconvรฉnients de PyTorch

Voici les avantages et les inconvรฉnients de PyTorch :

Avantages de PyTorch

  1. Bibliothรจque simplifiรฉe
    Le code PyTorch est simple. C'est facile ร  comprendre et vous utilisez la bibliothรจque instantanรฉment. Par exemple, jetez un ล“il ร  lโ€™extrait de code ci-dessous :
class Net(torch.nn.Module):
   def __init__(self):
       super(Net, self).__init__()
       self.layer = torch.nn.Linear(1, 1)

   def forward(self, x):
       x = self.layer(x)      
       return x

Comme mentionnรฉ ci-dessus, vous pouvez dรฉfinir facilement le modรจle de rรฉseau et comprendre le code rapidement sans trop de formation.

  1. Graphique informatique dynamique

Graphique informatique dynamique

Source de l'image : Explorer l'apprentissage profond avec PyTorch

Pytorch propose un graphique informatique dynamique (DAG). Les graphiques informatiques sont un moyen d'exprimer des expressions mathรฉmatiques dans des modรจles graphiques ou des thรฉories telles que les nล“uds et les arรชtes. Le nล“ud effectuera l'opรฉration mathรฉmatique et le bord est un tenseur qui sera introduit dans les nล“uds et acheminera la sortie du nล“ud dans le tenseur.

DAG est un graphique qui a une forme arbitraire et capable d'effectuer des opรฉrations entre diffรฉrents graphiques d'entrรฉe. ร€ chaque itรฉration, un nouveau graphique est crรฉรฉ. Ainsi, il est possible dโ€™avoir la mรชme structure de graphe ou de crรฉer un nouveau graphe avec une opรฉration diffรฉrente, ou encore on peut lโ€™appeler un graphe dynamique.

  1. Meilleures performances

Les communautรฉs et les chercheurs รฉvaluent et comparent les frameworks pour voir lequel est le plus rapide. Un dรฉpรดt GitHub Benchmark sur les frameworks de Deep Learning et les GPU a signalรฉ que PyTorch est plus rapide que l'autre framework en termes d'images traitรฉes par seconde.

Comme vous pouvez le voir ci-dessous, les graphiques de comparaison avec vgg16 et resnet152

Avantages de PyTorch

Avantages de PyTorch

  1. Originaire Python

PyTorch est davantage basรฉ sur Python. Par exemple, si vous souhaitez entraรฎner un modรจle, vous pouvez utiliser un flux de contrรดle natif tel que les boucles et les rรฉcursions sans avoir besoin d'ajouter des variables ou des sessions plus spรฉciales pour pouvoir les exรฉcuter. Ceci est trรจs utile pour le processus de formation.

Pytorch implรฉmente รฉgalement la programmation impรฉrative, et elle est nettement plus flexible. Ainsi, il est possible d'imprimer la valeur du tenseur au milieu d'un processus de calcul.

Inconvรฉnient de PyTorch

PyTorch nรฉcessite des applications tierces pour la visualisation. Il a รฉgalement besoin d'un serveur API pour la production.

Ensuite, dans ce didacticiel PyTorch, nous dรฉcouvrirons la diffรฉrence entre PyTorch et TensorFlow.

PyTorch contre. Flux tensoriel

Paramรจtres PyTorch Tensorflow
Dรฉfinition du modรจle Le modรจle est dรฉfini dans une sous-classe et propose un package facile ร  utiliser Le modรจle est dรฉfini avec plusieurs et vous devez comprendre la syntaxe
Prise en charge du GPU Oui Oui
Type de graphique Dynamique Statique
Outils Aucun outil de visualisation Vous pouvez utiliser l'outil de visualisation Tensorboard
Communautรฉ La communautรฉ continue de s'agrandir De grandes communautรฉs actives

Installer PyTorch

Linux

Il est simple de l'installer sous Linux. Vous pouvez choisir d'utiliser un environnement virtuel ou de l'installer directement avec un accรจs root. Tapez cette commande dans le terminal

pip3 install --upgrade torch torchvision

AWS Sagemaker

Sagemaker est l'une des plateformes de Amazon Service Web qui offre un puissant moteur d'apprentissage automatique avec des configurations d'apprentissage en profondeur prรฉinstallรฉes permettant aux scientifiques des donnรฉes ou aux dรฉveloppeurs de crรฉer, former et dรฉployer des modรจles ร  n'importe quelle รฉchelle.

Ouvrez d'abord le Amazon Faiseur de sauge console et cliquez sur Crรฉer une instance de notebook et remplissez tous les dรฉtails de votre notebook.

AWS Sagemaker

ร‰tape suivante, cliquez sur Ouvrir pour lancer votre instance de notebook.

AWS Sagemaker

Enfin, dans Jupyter, Cliquez sur Nouveau et choisissez conda_pytorch_p36 et vous รชtes prรชt ร  utiliser votre instance de notebook avec Pytorch installรฉ.

Ensuite, dans ce didacticiel PyTorch, nous dรฉcouvrirons les bases du framework PyTorch.

Bases du framework PyTorch

Apprenons les concepts de base de PyTorch avant de plonger en profondeur. PyTorch utilise Tensor pour chaque variable similaire au ndarray de numpy mais avec prise en charge du calcul GPU. Ici, nous expliquerons le modรจle de rรฉseau, la fonction de perte, Backprop et Optimizer.

Modรจle de rรฉseau

Le rรฉseau peut รชtre construit en sous-classant torch.nn. Il y a 2 parties principales,

  1. La premiรจre partie consiste ร  dรฉfinir les paramรจtres et les calques que vous utiliserez
  2. La deuxiรจme partie est la tรขche principale appelรฉe processus avancรฉ qui prendra une entrรฉe et prรฉdira la sortie.
Import torch
import torch.nn as nn
import torch.nn.functional as F

class Model(nn.Module):
 def __init__(self):
        super(Model, self).__init__()
        self.conv1 = nn.Conv2d(3, 20, 5)
        self.conv2 = nn.Conv2d(20, 40, 5)
self.fc1 = nn.Linear(320, 10)

def forward(self, x):
       x = F.relu(self.conv1(x))
       x = F.relu(self.conv2(x))
       x = x.view(-1, 320)
       x = F.relu(self.fc1(x))
       return F.log_softmax(x)

net = Model()

Comme vous pouvez le voir ci-dessus, vous crรฉez une classe de nn.Module appelรฉe Model. Il contient 2 calques Conv2d et un calque linรฉaire. La premiรจre couche conv2d prend une entrรฉe de 3 et la forme de sortie de 20. La deuxiรจme couche prendra une entrรฉe de 20 et produira une forme de sortie de 40. La derniรจre couche est une couche entiรจrement connectรฉe en forme de 320 et produira une sortie de 10.

Le processus forward prendra une entrรฉe de X et la transmettra ร  la couche conv1 et exรฉcutera la fonction ReLU,

De mรชme, il alimentera รฉgalement la couche conv2. Aprรจs cela, le x sera remodelรฉ en (-1, 320) et alimentera la couche FC finale. Avant d'envoyer la sortie, vous utiliserez la fonction d'activation softmax.

Le processus en arriรจre est automatiquement dรฉfini par autograd, il vous suffit donc de dรฉfinir le processus en avant.

Fonction de perte

La fonction de perte est utilisรฉe pour mesurer dans quelle mesure le modรจle de prรฉdiction est capable de prรฉdire les rรฉsultats attendus. PyTorch possรจde dรฉjร  de nombreuses fonctions de perte standard dans le module torch.nn. Par exemple, vous pouvez utiliser la perte d'entropie croisรฉe pour rรฉsoudre un problรจme de classification PyTorch multi-classe. Il est facile de dรฉfinir la fonction de perte et de calculer les pertes :

loss_fn = nn.CrossEntropyLoss()

#training process
loss = loss_fn(out, target)

Il est facile d'utiliser votre propre calcul de fonction de perte avec PyTorch.

Contre-propriรฉtรฉ

Pour effectuer la rรฉtropropagation, vous appelez simplement los.backward(). L'erreur sera calculรฉe mais n'oubliez pas d'effacer le dรฉgradรฉ existant avec zero_grad()

net.zero_grad() # to clear the existing gradient
loss.backward() # to perform backpropragation

Optimizer

Le torch.optim fournit des algorithmes dโ€™optimisation courants. Vous pouvez dรฉfinir un optimiseur en une รฉtape simple :

optimizer = torch.optim.SGD(net.parameters(), lr = 0.01, momentum=0.9)

Vous devez transmettre les paramรจtres du modรจle de rรฉseau et le taux d'apprentissage afin qu'ร  chaque itรฉration, les paramรจtres soient mis ร  jour aprรจs le processus de backprop.

Rรฉgression simple avec PyTorch

Apprenons la rรฉgression simple avec des exemples PyTorch :

ร‰tape 1) Crรฉation de notre modรจle de rรฉseau

Notre modรจle de rรฉseau est une simple couche linรฉaire avec une forme d'entrรฉe et de sortie de 1.

from __future__ import print_function

import torch
import torch.nn as nn
import torch.nn.functional as F
from torch.autograd import Variable

class Net(nn.Module):
   def __init__(self):
       super(Net, self).__init__()
       self.layer = torch.nn.Linear(1, 1)

   def forward(self, x):
       x = self.layer(x)      
       return x

net = Net()
print(net)

Et la sortie rรฉseau devrait รชtre comme รงa

Net(
  (hidden): Linear(in_features=1, out_features=1, bias=True)
)

ร‰tape 2) Tester les donnรฉes

Avant de commencer le processus de formation, vous devez connaรฎtre nos donnรฉes. Vous crรฉez une fonction alรฉatoire pour tester notre modรจle. Oui = x3 pรฉchรฉ(x)+ 3x+0.8 rand(100)

# Visualize our data
import matplotlib.pyplot as plt
import numpy as np

x = np.random.rand(100)
y = np.sin(x) * np.power(x,3) + 3*x + np.random.rand(100)*0.8

plt.scatter(x, y)
plt.show()

Voici le nuage de points de notre fonction :

Nuage de points de rรฉgression simple avec PyTorch

Avant de commencer le processus de formation, vous devez convertir le tableau numpy en variables prises en charge par Torch et autograd, comme indiquรฉ dans l'exemple de rรฉgression PyTorch ci-dessous.

# convert numpy array to tensor in shape of input size
x = torch.from_numpy(x.reshape(-1,1)).float()
y = torch.from_numpy(y.reshape(-1,1)).float()
print(x, y)

ร‰tape 3) Optimiseur et perte

Ensuite, vous devez dรฉfinir l'optimiseur et la fonction de perte pour notre processus de formation.

# Define Optimizer and Loss Function
optimizer = torch.optim.SGD(net.parameters(), lr=0.2)
loss_func = torch.nn.MSELoss()

ร‰tape 4) Formation

Commenรงons maintenant notre processus de formation. Avec une รฉpoque de 250, vous itรฉrerez nos donnรฉes pour trouver la meilleure valeur pour nos hyperparamรจtres.

inputs = Variable(x)
outputs = Variable(y)
for i in range(250):
   prediction = net(inputs)
   loss = loss_func(prediction, outputs) 
   optimizer.zero_grad()
   loss.backward()        
   optimizer.step()       

   if i % 10 == 0:
       # plot and show learning process
       plt.cla()
       plt.scatter(x.data.numpy(), y.data.numpy())
       plt.plot(x.data.numpy(), prediction.data.numpy(), 'r-', lw=2)
       plt.text(0.5, 0, 'Loss=%.4f' % loss.data.numpy(), fontdict={'size': 10, 'color':  'red'})
       plt.pause(0.1)

plt.show()

ร‰tape 5) Rรฉsultat

Comme vous pouvez le voir ci-dessous, vous avez effectuรฉ avec succรจs une rรฉgression PyTorch avec un rรฉseau neuronal. En fait, ร  chaque itรฉration, la ligne rouge du tracรฉ sera mise ร  jour et changera de position pour s'adapter aux donnรฉes. Mais dans cette image, il ne vous montre que le rรฉsultat final, comme le montre l'exemple PyTorch ci-dessous :

Diagramme de dispersion du rรฉsultat de la rรฉgression simple

Exemple de classification d'images avec PyTorch

L'une des mรฉthodes populaires pour apprendre les bases de l'apprentissage en profondeur est avec l'ensemble de donnรฉes MNIST. C'est le ยซ Hello World ยป dans le deep learning. L'ensemble de donnรฉes contient des nombres manuscrits de 0 ร  9 avec un total de 60,000 10,000 รฉchantillons d'apprentissage et 28 28 รฉchantillons de test dรฉjร  รฉtiquetรฉs avec une taille de ร— pixels.

Classification d'images avec PyTorch

ร‰tape 1) Prรฉtraiter les donnรฉes

Dans la premiรจre รฉtape de cet exemple de classification PyTorch, vous chargerez l'ensemble de donnรฉes ร  l'aide du module torchvision.

Avant de commencer le processus de formation, vous devez comprendre les donnรฉes. Torchvision chargera l'ensemble de donnรฉes et transformera les images avec les exigences appropriรฉes pour le rรฉseau telles que la forme et la normalisation des images.

import torch
import torchvision
import numpy as np
from torchvision import datasets, models, transforms

# This is used to transform the images to Tensor and normalize it
transform = transforms.Compose(
   [transforms.ToTensor(),
    transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])

training = torchvision.datasets.MNIST(root='./data', train=True,
                                       download=True, transform=transform)
train_loader = torch.utils.data.DataLoader(training, batch_size=4,
                                         shuffle=True, num_workers=2)

testing = torchvision.datasets.MNIST(root='./data', train=False,
                                      download=True, transform=transform)
test_loader = torch.utils.data.DataLoader(testing, batch_size=4,
                                        shuffle=False, num_workers=2)

classes = ('0', '1', '2', '3',
          '4', '5', '6', '7', '8', '9')
         
import matplotlib.pyplot as plt
import numpy as np

#create an iterator for train_loader
# get random training images
data_iterator = iter(train_loader)
images, labels = data_iterator.next()

#plot 4 images to visualize the data
rows = 2
columns = 2
fig=plt.figure()
for i in range(4):
   fig.add_subplot(rows, columns, i+1)
   plt.title(classes[labels[i]])
   img = images[i] / 2 + 0.5     # this is for unnormalize the image
   img = torchvision.transforms.ToPILImage()(img)
   plt.imshow(img)
plt.show()

La fonction de transformation convertit les images en tenseur et normalise la valeur. La fonction torchvision.transforms.MNIST tรฉlรฉchargera l'ensemble de donnรฉes (s'il n'est pas disponible) dans le rรฉpertoire, dรฉfinira l'ensemble de donnรฉes pour la formation si nรฉcessaire et effectuera le processus de transformation.

Pour visualiser l'ensemble de donnรฉes, vous utilisez le data_iterator pour obtenir le prochain lot d'images et d'รฉtiquettes. Vous utilisez matplot pour tracer ces images et leur รฉtiquette appropriรฉe. Comme vous pouvez le voir ci-dessous nos images et leurs รฉtiquettes.

Exemple de classification d'images avec PyTorch

ร‰tape 2) Configuration du modรจle de rรฉseau

Maintenant, dans cet exemple PyTorch, vous allez crรฉer un rรฉseau neuronal simple pour la classification d'images PyTorch.

Ici, nous vous prรฉsentons une autre faรงon de crรฉer le modรจle de rรฉseau dans PyTorch. Nous utiliserons nn.Sequential pour crรฉer un modรจle de sรฉquence au lieu de crรฉer une sous-classe de nn.Module.

import torch.nn as nn

# flatten the tensor into 
class Flatten(nn.Module):
   def forward(self, input):
       return input.view(input.size(0), -1)

#sequential based model
seq_model = nn.Sequential(
           nn.Conv2d(1, 10, kernel_size=5),
           nn.MaxPool2d(2),
           nn.ReLU(),
           nn.Dropout2d(),
           nn.Conv2d(10, 20, kernel_size=5),
           nn.MaxPool2d(2),
           nn.ReLU(),
           Flatten(),
           nn.Linear(320, 50),
           nn.ReLU(),
           nn.Linear(50, 10),
           nn.Softmax(),
         )

net = seq_model
print(net)

Voici le rรฉsultat de notre modรจle de rรฉseau

Sequential(
  (0): Conv2d(1, 10, kernel_size=(5, 5), stride=(1, 1))
  (1): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
  (2): ReLU()
  (3): Dropout2d(p=0.5)
  (4): Conv2d(10, 20, kernel_size=(5, 5), stride=(1, 1))
  (5): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
  (6): ReLU()
  (7): Flatten()
  (8): Linear(in_features=320, out_features=50, bias=True)
  (9): ReLU()
  (10): Linear(in_features=50, out_features=10, bias=True)
  (11): Softmax()
)

Explication du rรฉseau

  1. La sรฉquence est que la premiรจre couche est une couche Conv2D avec une forme d'entrรฉe de 1 et une forme de sortie de 10 avec une taille de noyau de 5.
  2. Ensuite, vous avez une couche MaxPool2D
  3. Une fonction d'activation ReLU
  4. une couche Dropout pour supprimer les valeurs de faible probabilitรฉ.
  5. Puis un deuxiรจme Conv2d avec la forme d'entrรฉe de 10 de la derniรจre couche et la forme de sortie de 20 avec une taille de noyau de 5
  6. Ensuite une couche MaxPool2d
  7. Fonction d'activation ReLU.
  8. Aprรจs cela, vous aplatirez le tenseur avant de l'insรฉrer dans le calque linรฉaire.
  9. La couche linรฉaire mappera notre sortie sur la deuxiรจme couche linรฉaire avec la fonction d'activation softmax

ร‰tape 3) Former le modรจle

Avant de dรฉmarrer le processus de formation, il est nรฉcessaire de configurer la fonction de critรจre et d'optimisation.

Pour le critรจre, vous utiliserez le CrossEntropyLoss. Pour l'optimiseur, vous utiliserez le SGD avec un taux d'apprentissage de 0.001 et un รฉlan de 0.9, comme indiquรฉ dans l'exemple PyTorch ci-dessous.

import torch.optim as optim

criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)

Le processus avancรฉ prendra la forme d'entrรฉe et la transmettra ร  la premiรจre couche conv2d. Ensuite, ร  partir de lร , il sera introduit dans maxpool2d et enfin mis dans la fonction d'activation ReLU. Le mรชme processus se produira dans la deuxiรจme couche conv2d. Aprรจs cela, l'entrรฉe sera remodelรฉe en (-1,320 ) et alimentera la couche fc pour prรฉdire la sortie.

Maintenant, vous allez commencer le processus de formation. Vous parcourrez notre ensemble de donnรฉes 2 fois ou avec une รฉpoque de 2 et imprimerez la perte actuelle tous les 2000 lots.

for epoch in range(2): 

#set the running loss at each epoch to zero
   running_loss = 0.0
# we will enumerate the train loader with starting index of 0
# for each iteration (i) and the data (tuple of input and labels)
   for i, data in enumerate(train_loader, 0):
       inputs, labels = data

# clear the gradient
       optimizer.zero_grad()

#feed the input and acquire the output from network
       outputs = net(inputs)

#calculating the predicted and the expected loss
       loss = criterion(outputs, labels)

#compute the gradient
       loss.backward()

#update the parameters
       optimizer.step()

       # print statistics
       running_loss += loss.item()
       if i % 1000 == 0:
           print('[%d, %5d] loss: %.3f' %
                 (epoch + 1, i + 1, running_loss / 1000))
           running_loss = 0.0

ร€ chaque รฉpoque, l'รฉnumรฉrateur obtiendra le prochain tuple d'entrรฉe et les รฉtiquettes correspondantes. Avant d'alimenter notre modรจle de rรฉseau, nous devons effacer le gradient prรฉcรฉdent. Ceci est nรฉcessaire car aprรจs le processus inverse (processus de rรฉtropropagation), le gradient sera accumulรฉ au lieu d'รชtre remplacรฉ. Ensuite, nous calculerons les pertes de la production prรฉvue ร  partir de la production attendue. Aprรจs cela, nous ferons une rรฉtropropagation pour calculer le gradient, et enfin, nous mettrons ร  jour les paramรจtres.

Voici le rรฉsultat du processus de formation

[1, 	1] loss: 0.002
[1,  1001] loss: 2.302
[1,  2001] loss: 2.295
[1,  3001] loss: 2.204
[1,  4001] loss: 1.930
[1,  5001] loss: 1.791
[1,  6001] loss: 1.756
[1,  7001] loss: 1.744
[1,  8001] loss: 1.696
[1,  9001] loss: 1.650
[1, 10001] loss: 1.640
[1, 11001] loss: 1.631
[1, 12001] loss: 1.631
[1, 13001] loss: 1.624
[1, 14001] loss: 1.616
[2, 	1] loss: 0.001
[2,  1001] loss: 1.604
[2,  2001] loss: 1.607
[2,  3001] loss: 1.602
[2,  4001] loss: 1.596
[2,  5001] loss: 1.608
[2,  6001] loss: 1.589
[2,  7001] loss: 1.610
[2,  8001] loss: 1.596
[2,  9001] loss: 1.598
[2, 10001] loss: 1.603
[2, 11001] loss: 1.596
[2, 12001] loss: 1.587
[2, 13001] loss: 1.596
[2, 14001] loss: 1.603

ร‰tape 4) Testez le modรจle

Aprรจs avoir entraรฎnรฉ notre modรจle, vous devez tester ou รฉvaluer avec d'autres ensembles d'images.

Nous utiliserons un itรฉrateur pour le test_loader, et il gรฉnรฉrera un lot d'images et d'รฉtiquettes qui seront transmises au modรจle entraรฎnรฉ. La sortie prรฉvue sera affichรฉe et comparรฉe ร  la sortie attendue.

#make an iterator from test_loader
#Get a batch of training images
test_iterator = iter(test_loader)
images, labels = test_iterator.next()

results = net(images)
_, predicted = torch.max(results, 1)

print('Predicted: ', ' '.join('%5s' % classes[predicted[j]] for j in range(4)))

fig2 = plt.figure()
for i in range(4):
   fig2.add_subplot(rows, columns, i+1)
   plt.title('truth ' + classes[labels[i]] + ': predict ' + classes[predicted[i]])
   img = images[i] / 2 + 0.5     # this is to unnormalize the image
   img = torchvision.transforms.ToPILImage()(img)
   plt.imshow(img)
plt.show()

Exemple de classification d'images avec PyTorch

Rรฉsumรฉ

  • PyTorch est un logiciel open source basรฉ sur Torch Machine Learning bibliothรจque pour traitement du langage naturel grรขce ร  Python.
  • Avantages de PyTorch : 1) Bibliothรจque simple, 2) Graphique informatique dynamique, 3) Meilleures performances, 4) Natif Python
  • PyTorch utilise Tensor pour chaque variable similaire au ndarray de numpy mais avec prise en charge du calcul GPU.
  • L'une des mรฉthodes les plus populaires pour apprendre les bases de l'apprentissage profond consiste ร  utiliser l'ensemble de donnรฉes MNIST.

Rรฉsumez cet article avec :