PyTorTutorialul cap.
โก Rezumat inteligent
PyTorch este framework-ul open-source de deep learning de la Meta, care va sta la baza a 85% din lucrฤrile de cercetare รฎn domeniul inteligenศei artificiale din 2026. LessCursurile acoperฤ instalarea, noศiunile de bazฤ despre framework, regresia simplฤ, clasificarea imaginilor ศi implementarea AWS SageMaker.

Ce este PyTorh?
PyTorch este un open-source TorBibliotecฤ de รฎnvฤศare automatฤ bazatฤ pe ch pentru procesarea limbajului natural folosind PythonEste similar cu NumPy, dar cu suport puternic pentru GPU. Oferฤ grafice computaศionale dinamice pe care le puteศi modifica din mers cu ajutorul funcศiei Autograd. PyTorch este, de asemenea, mai rapid decรขt alte framework-uri. A fost dezvoltat de Grupul de Cercetare AI al Facebook รฎn 2016.
ศtiind ce PyTorch oferฤ o perspectivฤ echilibratฤ asupra punctelor forte ศi dezavantajelor sale.
PyTorAvantaje ศi dezavantaje
Urmฤtoarele sunt avantajele ศi dezavantajele PyTorcH:
Avantajele PyTorch
- Biblioteca simplฤ
PyTorCodul ch este simplu. Este uศor de รฎnศeles ศi foloseศti biblioteca instantaneu. De exemplu, aruncฤ o privire la fragmentul de cod de mai jos:
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
Dupฤ cum am menศionat mai sus, puteศi defini cu uศurinศฤ modelul de reศea ศi puteศi รฎnศelege rapid codul fฤrฤ prea multฤ pregฤtire.
- Graficul de calcul dinamic
Sursa imaginii: Explorarea รฎnvฤศฤrii profunde cu PyTorch
PyTorch oferฤ Grafuri Computaศionale Dinamice (DAG). Grafurile computaศionale sunt o modalitate de a exprima expresii matematice รฎn modele grafice sau teorii, cum ar fi noduri ศi muchii. Nodul va efectua operaศia matematicฤ, iar muchia este un Tensor care va fi introdus รฎn noduri ศi va transporta ieศirea nodului รฎn Tensor.
DAG este un grafic care are o formฤ arbitrarฤ ศi capabil sฤ facฤ operaศii รฎntre diferite grafice de intrare. La fiecare iteraศie, este creat un nou grafic. Deci, este posibil sฤ aveศi aceeaศi structurฤ de grafic sau sฤ creaศi un nou grafic cu o operaศie diferitฤ, sau รฎl putem numi un grafic dinamic.
- Performanศฤ mai bunฤ
Comunitฤศile ศi cercetฤtorii, comparaศi ศi comparaศi cadrele pentru a vedea care dintre ele este mai rapidฤ. Un depozit GitHub Benchmark privind cadrele de รฎnvฤศare profundฤ ศi GPU-uri a raportat cฤ PyTorch este mai rapid decรขt celฤlalt framework รฎn ceea ce priveศte imaginile procesate pe secundฤ.
Dupฤ cum puteศi vedea mai jos, graficele de comparaศie cu vgg16 ศi resnet152
- Nativ Python
PyTorch este mai mult bazat pe Python. De exemplu, dacฤ vrei sฤ antrenezi un model, poศi folosi un flux de control nativ, cum ar fi loo.ping ศi recursivitฤศi fฤrฤ a fi nevoie sฤ adฤugaศi mai multe variabile sau sesiuni speciale pentru a le putea rula. Acest lucru este foarte util pentru procesul de antrenament.
PyTorch implementeazฤ ศi Programarea Imperativฤ, fiind cu siguranศฤ mai flexibilฤ. Prin urmare, este posibil sฤ se afiศeze valoarea tensorului รฎn mijlocul unui proces de calcul.
Dezavantajul PyTorch
PyTorch necesitฤ aplicaศii terศe pentru vizualizare. De asemenea, are nevoie de un server API pentru producศie.
Urmฤtorul รฎn acest PyTorรn tutorialul ch, vom รฎnvฤศa despre diferenศa dintre PyTorch ศi TensorFlow.
PyTorch vs. TensorFlow
| Parametru | PyTorch | TensorFlow |
|---|---|---|
| Definiศia modelului | Modelul este definit รฎntr-o subclasฤ ศi oferฤ pachet uศor de utilizat | Modelul este definit cu multe ศi trebuie sฤ รฎnศelegeศi sintaxa |
| Suport GPU | Da | Da |
| Tipul graficului | Dinamic | Static |
| Instrumente | Nici un instrument de vizualizare | Puteศi utiliza instrumentul de vizualizare Tensorboard |
| Comunitate | Comunitatea รฎncฤ รฎn creศtere | Comunitฤศi mari active |
Avรขnd รฎn vedere comparaศia, urmฤtorul pas este obศinerea lui PyTorch care ruleazฤ local sau รฎn cloud.
Instalarea PyTorch
Linux
Este simplu sฤ รฎl instalaศi รฎn Linux. Puteศi alege sฤ utilizaศi un mediu virtual sau sฤ รฎl instalaศi direct cu acces root. Tastaศi aceastฤ comandฤ รฎn terminal
pip3 install --upgrade torch torchvision
AWS Sagemaker
Sagemaker este una dintre platformele din Amazon Serviciu web care oferฤ un motor puternic de รฎnvฤศare automatฤ cu configuraศii de รฎnvฤศare profundฤ preinstalate pentru ca cercetฤtorii de date sau dezvoltatorii sฤ construiascฤ, sฤ antreneze ศi sฤ implementeze modele la orice scarฤ.
Mai รฎntรขi Deschideศi Amazon Sagemaker console ศi faceศi clic pe Creare o instanศฤ de blocnotes ศi completaศi toate detaliile pentru blocnotesul dvs.
Pasul urmฤtor, faceศi clic pe Deschidere pentru a lansa instanศa de notebook.
รn cele din urmฤ, รฎn Jupyter, Faceศi clic pe Nou ศi alegeศi conda_pytorch_p36 ศi sunteศi gata sฤ utilizaศi instanศa de notebook cu PyTorch instalat.
Urmฤtorul รฎn acest PyTortutorial ch, vom รฎnvฤศa despre PyTorNoศiuni de bazฤ ale cadrului CH.
Odatฤ instalarea finalizatฤ, API-ul รฎn sine este urmฤtoarea oprire.
PyTorNoศiuni de bazฤ despre framework-ul ch
Sฤ รฎnvฤศฤm conceptele de bazฤ ale PyTorรฎnainte de a ne aprofunda. PyTorch foloseศte Tensor pentru fiecare variabilฤ, similar cu ndarray din numpy, dar cu suport de calcul GPU. Aici vom explica modelul de reศea, funcศia de pierdere, Backprop ศi Optimizer.
Model de reศea
Reศeaua poate fi construitฤ prin subclasificarea torศei.nn. Existฤ 2 pฤrศi principale,
- Prima parte este sฤ definiศi parametrii ศi straturile pe care le veศi folosi
- A doua parte este sarcina principalฤ numitฤ proces de avans, care va prelua o intrare ศi va prezice rezultatul.
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()
Dupฤ cum puteศi vedea mai sus, creaศi o clasฤ de nn.Module numitฤ Model. Conศine 2 straturi Conv2d ศi un strat Linear. Primul strat conv2d are o intrare de 3 ศi forma de ieศire de 20. Al doilea strat va avea o intrare de 20 ศi va produce o formฤ de ieศire de 40. Ultimul strat este un strat complet conectat รฎn forma de 320 ศi va produce o ieศire de 10.
Procesul รฎnainte va prelua o intrare de X ศi o va alimenta stratul conv1 ศi va efectua funcศia ReLU,
รn mod similar, va alimenta ศi stratul conv2. Dupฤ aceea, x-ul va fi remodelat รฎn (-1, 320) ศi va fi alimentat รฎn stratul FC final. รnainte de a trimite ieศirea, veศi folosi funcศia de activare softmax.
Procesul รฎnapoi este definit automat de autograd, aศa cฤ trebuie doar sฤ definiศi procesul รฎnainte.
Funcศia de pierdere
Funcศia de pierdere este utilizatฤ pentru a mฤsura cรขt de bine este capabil modelul de predicศie sฤ prezicฤ rezultatele aศteptate. PyTorch are deja multe funcศii standard de pierdere รฎn modulul torch.nn. De exemplu, puteศi utiliza pierderea de entropie รฎncruciศatฤ pentru a rezolva o problemฤ Py multi-clasฤ.Torproblemฤ de clasificare ch. Este uศor sฤ definim funcศia de pierdere ศi sฤ calculฤm pierderile:
loss_fn = nn.CrossEntropyLoss() #training process loss = loss_fn(out, target)
Este uศor sฤ foloseศti propriul calcul al funcศiei de pierdere cu PyTorch.
Propul din spate
Pentru a efectua backpropagation, apelaศi pur ศi simplu los.backward(). Eroarea va fi calculatฤ, dar nu uitaศi sฤ ศtergeศi gradientul existent cu zero_grad()
net.zero_grad() # to clear the existing gradient loss.backward() # to perform backpropragation
Instrumentul de optimizare a
Torch.optim oferฤ algoritmi comuni de optimizare. Puteศi defini un optimizator cu un pas simplu:
optimizer = torch.optim.SGD(net.parameters(), lr = 0.01, momentum=0.9)
Trebuie sฤ treceศi parametrii modelului de reศea ศi rata de รฎnvฤศare, astfel รฎncรขt la fiecare iteraศie parametrii sฤ fie actualizaศi dupฤ procesul de backprop.
Cea mai clarฤ modalitate de a รฎnvฤศa API-ul este un exemplu mic, complet.
Regresie simplฤ cu PyTorch
Sฤ รฎnvฤศฤm regresie simplฤ cu PyTorexemple de ch:
Pasul 1) Crearea modelului nostru de reศea
Modelul nostru de reศea este un strat liniar simplu, cu o formฤ de intrare ศi o formฤ de ieศire 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)
ศi ieศirea din reศea ar trebui sฤ fie aศa
Net( (hidden): Linear(in_features=1, out_features=1, bias=True) )
Pasul 2) Datele de testare
รnainte de a รฎncepe procesul de formare, trebuie sฤ cunoaศteศi datele noastre. Faceศi o funcศie aleatorie pentru a testa modelul nostru. Y = x3 sin(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()
Iatฤ diagrama de dispersie a funcศiei noastre:
รnainte de a รฎncepe procesul de antrenament, trebuie sฤ convertiศi matricea numpy รฎn variabile acceptate de Torch ศi autograd aศa cum se aratฤ รฎn Py de mai josTorexemplu de regresie ch.
# 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)
Pasul 3) Optimizer ศi pierdere
รn continuare, ar trebui sฤ definiศi Optimizatorul ศi Funcศia de pierdere pentru procesul nostru de antrenament.
# Define Optimizer and Loss Function optimizer = torch.optim.SGD(net.parameters(), lr=0.2) loss_func = torch.nn.MSELoss()
Pasul 4) Antrenament
Acum sฤ รฎncepem procesul nostru de formare. Cu o epocฤ de 250, veศi repeta datele noastre pentru a gฤsi cea mai bunฤ valoare pentru hiperparametrii noศtri.
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()
Pasul 5) Rezultat
Dupฤ cum puteศi vedea mai jos, aศi executat cu succes PyTorRegresie ch cu o reศea neuronalฤ. De fapt, la fiecare iteraศie, linia roศie din grafic se va actualiza ศi รฎศi va schimba poziศia pentru a se potrivi datelor. Dar รฎn aceastฤ imagine, se afiศeazฤ doar rezultatul final, aศa cum se aratฤ รฎn diagrama Py de mai jos.Torexemplu ch:
Regresia este o รฎncฤlzire; clasificarea imaginilor exerseazฤ muศchii de รฎnvฤศare profundฤ ai lui PyTorch.
Exemplu de clasificare a imaginilor cu PyTorch
Una dintre metodele populare de a รฎnvฤศa elementele de bazฤ รฎnvฤศare profundฤ este cu setul de date MNIST. Este โHello Worldโ รฎn รฎnvฤศarea profundฤ. Setul de date conศine numere scrise de mรขnฤ de la 0 la 9, cu un total de 60,000 de mostre de antrenament ศi 10,000 de mostre de testare care sunt deja etichetate cu dimensiunea de 28ร28 pixeli.
Pasul 1) Preproceseazฤ datele
รn prima etapฤ a acestui PyTorexemplu de clasificare ch, veศi รฎncฤrca setul de date folosind modulul torchvision.
รnainte de a รฎncepe procesul de antrenament, trebuie sฤ รฎnศelegeศi datele. Torchvision va รฎncฤrca setul de date ศi va transforma imaginile cu cerinศele corespunzฤtoare pentru reศea, cum ar fi forma ศi normalizarea imaginilor.
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()
Funcศia de transformare converteศte imaginile รฎn tensor ศi normalizeazฤ valoarea. Funcศia torchvision.transforms.MNIST, va descฤrca setul de date (dacฤ nu este disponibil) รฎn director, va seta setul de date pentru antrenament dacฤ este necesar ศi va face procesul de transformare.
Pentru a vizualiza setul de date, utilizaศi data_iterator pentru a obศine urmฤtorul lot de imagini ศi etichete. Folosiศi matplot pentru a reprezenta aceste imagini ศi eticheta corespunzฤtoare. Dupฤ cum puteศi vedea mai jos imaginile noastre ศi etichetele lor.
Pasul 2) Configurarea modelului de reศea
Acum, รฎn acest PyTorDe exemplu, veศi crea o reศea neuronalฤ simplฤ pentru PyTorClasificarea imaginilor ch.
Aici, vฤ prezentฤm o altฤ modalitate de a crea modelul de reศea รฎn PyTorcap. Vom folosi nn.Sequential pentru a crea un model de secvenศฤ รฎn loc sฤ creฤm o subclasฤ a 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)
Iatฤ rezultatul modelului nostru de reศea
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() )
Explicaศia reศelei
- Secvenศa este cฤ primul strat este un strat Conv2D cu o formฤ de intrare de 1 ศi o formฤ de ieศire de 10 cu o dimensiune a nucleului de 5
- Apoi, aveศi un strat MaxPool2D
- O funcศie de activare ReLU
- un strat de abandon pentru a elimina valorile cu probabilitate scฤzutฤ.
- Apoi un al doilea Conv2d cu forma de intrare de 10 din ultimul strat ศi forma de ieศire de 20 cu o dimensiune a nucleului de 5
- Apoi un strat MaxPool2d
- Funcศia de activare ReLU.
- Dupฤ aceea, veศi aplatiza tensorul รฎnainte de a-l introduce รฎn stratul Linear
- Stratul liniar va mapa rezultatul nostru la al doilea strat liniar cu funcศia de activare softmax
Pasul 3) Antreneazฤ modelul
รnainte de a รฎncepe procesul de antrenament, este necesar sฤ configuraศi funcศia de criteriu ศi de optimizare.
Pentru criteriu, veศi utiliza CrossEntropyLoss. Pentru optimizator, veศi utiliza SGD cu o ratฤ de รฎnvฤศare de 0.001 ศi un impuls de 0.9, aศa cum se aratฤ รฎn diagrama Py de mai jos.Torexemplu.
import torch.optim as optim criterion = nn.CrossEntropyLoss() optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)
Procesul de transmitere va lua forma de intrare ศi o va trece la primul strat conv2d. Apoi, de acolo, va fi alimentat รฎn maxpool2d ศi, รฎn final, va fi introdus รฎn funcศia de activare ReLU. Acelaศi proces va avea loc รฎn al doilea strat conv2d. Dupฤ aceea, intrarea va fi remodelatฤ รฎn (-1,320) ศi va fi alimentatฤ รฎn stratul fc pentru a prezice ieศirea.
Acum, veศi รฎncepe procesul de antrenament. Veศi parcurge setul de date de 2 ori sau cu o epocฤ de 2 ศi veศi imprima pierderea curentฤ la fiecare 2000 de lot.
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
La fiecare epocฤ, enumeratorul va primi urmฤtorul tuplu de intrare ศi etichetele corespunzฤtoare. รnainte de a alimenta intrarea รฎn modelul nostru de reศea, trebuie sฤ ศtergem gradientul anterior. Acest lucru este necesar deoarece dupฤ procesul invers (procesul de backpropagation), gradientul va fi acumulat รฎn loc sฤ fie รฎnlocuit. Apoi, vom calcula pierderile de la ieศirea prezisฤ de la ieศirea aศteptatฤ. Dupฤ aceea, vom face o retropropagare pentru a calcula gradientul ศi, รฎn final, vom actualiza parametrii.
Iatฤ rezultatul procesului de instruire
[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
Pasul 4) Testaศi modelul
Dupฤ ce ne instruiศi modelul, trebuie sฤ testaศi sau sฤ evaluaศi cu alte seturi de imagini.
Vom folosi un iterator pentru test_loader ศi va genera un lot de imagini ศi etichete care vor fi transmise modelului antrenat. Ieศirea estimatฤ va fi afiศatฤ ศi comparatฤ cu rezultatul aศteptat.
#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()










