PyTorch-vejledning
โก Smart opsummering
PyTorch er open source-frameworket for deep learning fra Meta, der nu driver 85 procent af AI-forskningsartikler i 2026. LessOns dรฆkker installation, grundlรฆggende framework, simpel regression, billedklassificering og AWS SageMaker-implementering.

Hvad er PyTorh?
PyTorch er en open source Torch-baseret maskinlรฆringsbibliotek til behandling af naturligt sprog ved hjรฆlp af PythonDet ligner NumPy, men med kraftig GPU-understรธttelse. Det tilbyder dynamiske beregningsgrafer, som du kan รฆndre pรฅ farten ved hjรฆlp af autograd. PyTorch er ogsรฅ hurtigere end nogle andre frameworks. Det blev udviklet af Facebooks AI Research Group i 2016.
At vide hvad PyTorch giver et afbalanceret blik pรฅ sine styrker og ulemper.
PyTorFordele og ulemper ved ch
Fรธlgende er fordele og ulemper ved PyTorch:
Fordele ved PyTorch
- Simpelt bibliotek
PyTorch-koden er enkel. Den er let at forstรฅ, og du bruger biblioteket med det samme. Se for eksempel kodestykket nedenfor:
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
Som nรฆvnt ovenfor kan du nemt definere netvรฆrksmodellen, og du kan hurtigt forstรฅ koden uden meget trรฆning.
- Dynamisk beregningsgraf
Billedkilde: Udforskning af dyb lรฆring med PyTorch
PyTorch tilbyder dynamisk beregningsgraf (DAG). Beregningsgrafer er en mรฅde at udtrykke matematiske udtryk i grafmodeller eller teorier sรฅsom noder og kanter. Noden udfรธrer den matematiske operation, og kanten er en tensor, der fรธres ind i noderne og bรฆrer nodens output i tensoren.
DAG er en graf, der har vilkรฅrlig form og i stand til at udfรธre operationer mellem forskellige inputgrafer. Hver iteration oprettes en ny graf. Sรฅ det er muligt at have den samme grafstruktur eller oprette en ny graf med en anden operation, eller vi kan kalde det en dynamisk graf.
- Bedre ydeevne
Fรฆllesskaber og forskere, benchmark og sammenligne rammer for at se, hvilken der er hurtigere. En GitHub-repo Benchmark pรฅ Deep Learning Frameworks og GPU'er rapporterede, at PyTorch er hurtigere end det andet framework med hensyn til billeder behandlet pr. sekund.
Som du kan se nedenfor, viser sammenligningsgraferne med vgg16 og resnet152
- Native Python
PyTorch er mere Python-baseret. Hvis du for eksempel vil trรฆne en model, kan du bruge et native kontrolflow som f.eks. loo.ping og rekursioner uden behov for at tilfรธje flere specielle variabler eller sessioner for at kunne kรธre dem. Dette er meget nyttigt for trรฆningsprocessen.
PyTorch implementerer ogsรฅ imperativ programmering, og det er bestemt mere fleksibelt. Sรฅ det er muligt at udskrive tensorvรฆrdien midt i en beregningsproces.
Ulempe ved PyTorch
PyTorch krรฆver tredjepartsapplikationer til visualisering. Den krรฆver ogsรฅ en API-server til produktion.
Nรฆste i denne PyTorch-tutorial, vi lรฆrer om forskellen mellem PyTorch og TensorFlow.
PyTorch vs. TensorFlow
| Parameter | PyTorch | TensorFlow |
|---|---|---|
| Model definition | Modellen er defineret i en underklasse og tilbyder en nem at bruge pakke | Modellen er defineret med mange, og du skal forstรฅ syntaksen |
| GPU Support | Ja | Ja |
| Graftype | Dynamisk | statisk |
| Vรฆrktรธjer | Intet visualiseringsvรฆrktรธj | Du kan bruge Tensorboard visualiseringsvรฆrktรธj |
| Fรฆllesskab | Samfundet vokser stadig | Store aktive fรฆllesskaber |
Med sammenligningen i tankerne er nรฆste skridt at fรฅ PyTorch kรธrer lokalt eller i skyen.
Installation af PyTorch
Linux
Det er ligetil at installere det i Linux. Du kan vรฆlge at bruge et virtuelt miljรธ eller installere det direkte med root-adgang. Indtast denne kommando i terminalen
pip3 install --upgrade torch torchvision
AWS Sagemaker
Sagemaker er en af โโplatformene i Amazon Web Service der tilbyder en kraftfuld Machine Learning-motor med forudinstallerede deep learning-konfigurationer til dataforskere eller udviklere til at bygge, trรฆne og implementere modeller i enhver skala.
ร bn fรธrst Amazon Sagemager konsollen og klik pรฅ Opret notesbogsforekomst og udfyld alle detaljerne for din notesbog.
Nรฆste trin, klik pรฅ ร bn for at starte din notebook-forekomst.
Endelig, In JupyterKlik pรฅ Ny, og vรฆlg conda_pytorch_p36, sรฅ er du klar til at bruge din notesbogsinstans med Py.Torch installeret.
Nรฆste i denne PyTorch tutorial, vi lรฆrer om PyTorGrundlรฆggende om ch-frameworket.
Installationen er pรฅ plads, selve API'en er nรฆste stop.
PyTorGrundlรฆggende om ch-rammevรฆrket
Lad os lรฆre de grundlรฆggende begreber i PyTorch fรธr vi dykker ned. PyTorch bruger Tensor for hver variabel, ligesom numpys ndarray, men med GPU-beregningsunderstรธttelse. Her vil vi forklare netvรฆrksmodellen, tabsfunktionen, Backprop og Optimizer.
Netvรฆrksmodel
Netvรฆrket kan konstrueres ved at underklassificere torch.nn. Der er 2 hoveddele,
- Den fรธrste del er at definere de parametre og lag, du vil bruge
- Den anden del er hovedopgaven kaldet den fremadrettede proces, der vil tage et input og forudsige outputtet.
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()
Som du kan se ovenfor, opretter du en klasse af nn.Module kaldet Model. Den indeholder 2 Conv2d lag og et lineรฆrt lag. Det fรธrste conv2d-lag tager et input pรฅ 3 og output-formen pรฅ 20. Det andet lag vil tage et input pรฅ 20 og vil producere en output-form pรฅ 40. Det sidste lag er et fuldt forbundet lag i form af 320 og vil producere et output pรฅ 10.
Fremadgรฅende proces vil tage et input af X og fรธre det til conv1 laget og udfรธre ReLU funktion,
Pรฅ samme mรฅde vil det ogsรฅ fodre conv2-laget. Derefter omformes x'et til (-1, 320) og fรธres ind i det endelige FC-lag. Fรธr du sender output, skal du bruge softmax aktiveringsfunktionen.
Baglรฆns processen er automatisk defineret af autograd, sรฅ du behรธver kun at definere fremad processen.
Tabsfunktion
Tabsfunktionen bruges til at mรฅle, hvor godt prรฆdiktionsmodellen er i stand til at forudsige de forventede resultater. PyTorch har allerede mange standard tabsfunktioner i torch.nn-modulet. For eksempel kan du bruge Cross-Entropy Loss til at lรธse et Py-problem med flere klasser.Torch klassifikationsproblem. Det er nemt at definere tabsfunktionen og beregne tabene:
loss_fn = nn.CrossEntropyLoss() #training process loss = loss_fn(out, target)
Det er nemt at bruge din egen tabsfunktionsberegning med PyTorch.
Rygprop
For at udfรธre backpropagation, kalder du blot los.backward(). Fejlen vil blive beregnet, men husk at rydde den eksisterende gradient med zero_grad()
net.zero_grad() # to clear the existing gradient loss.backward() # to perform backpropragation
Optimizer
Torch.optim giver almindelige optimeringsalgoritmer. Du kan definere en optimering med et enkelt trin:
optimizer = torch.optim.SGD(net.parameters(), lr = 0.01, momentum=0.9)
Du skal videregive netvรฆrksmodelparametrene og indlรฆringshastigheden, sรฅ parametrene ved hver iteration vil blive opdateret efter backprop-processen.
Den reneste mรฅde at lรฆre API'en at kende pรฅ er et lille, end-to-end eksempel.
Simpel regression med PyTorch
Lad os lรฆre simpel regression med PyTorch eksempler:
Trin 1) Oprettelse af vores netvรฆrksmodel
Vores netvรฆrksmodel er et simpelt lineรฆrt lag med en input- og en outputform pรฅ 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)
Og netvรฆrksudgangen skal vรฆre sรฅdan
Net( (hidden): Linear(in_features=1, out_features=1, bias=True) )
Trin 2) Testdata
Fรธr du starter uddannelsesprocessen, skal du kende vores data. Du laver en tilfรฆldig funktion for at teste vores model. 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()
Her er spredningsplottet for vores funktion:
Fรธr du starter trรฆningsprocessen, skal du konvertere numpy-arrayet til variabler, der understรธttes af Torch og autograd som vist i nedenstรฅende PyToreksempel pรฅ ch-regression.
# 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)
Trin 3) Optimering og tab
Dernรฆst skal du definere optimerings- og tabsfunktionen for vores trรฆningsproces.
# Define Optimizer and Loss Function optimizer = torch.optim.SGD(net.parameters(), lr=0.2) loss_func = torch.nn.MSELoss()
Trin 4) Trรฆning
Lad os nu starte vores trรฆningsproces. Med en epoke pรฅ 250 vil du iterere vores data for at finde den bedste vรฆrdi for vores hyperparametre.
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()
Trin 5) Resultat
Som du kan se nedenfor, har du udfรธrt Py med succesTorch-regression med et neuralt netvรฆrk. Faktisk vil den rรธde linje i plottet ved hver iteration opdatere og รฆndre sin position for at passe til dataene. Men pรฅ dette billede viser den kun det endelige resultat, som vist i Py-diagrammet nedenfor.Torch eksempel:
Regression er en opvarmning; billedklassificering trรฆner Py's dybdelรฆringsmusklerTorch.
Eksempel pรฅ billedklassificering med PyTorch
En af de populรฆre metoder til at lรฆre det grundlรฆggende dyb lรฆring er med MNIST-datasรฆttet. Det er "Hej verden" i dyb lรฆring. Datasรฆttet indeholder hรฅndskrevne tal fra 0 โ 9 med i alt 60,000 trรฆningsprรธver og 10,000 testprรธver, der allerede er mรฆrket med stรธrrelsen 28ร28 pixels.
Trin 1) Forbehandle dataene
I det fรธrste trin af denne PyTorch-klassifikationseksempel, du skal indlรฆse datasรฆttet ved hjรฆlp af torchvision-modulet.
Fรธr du starter trรฆningsprocessen, skal du forstรฅ dataene. Torchvision vil indlรฆse datasรฆttet og transformere billederne med de passende krav til netvรฆrket, sรฅsom form og normalisering af billederne.
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()
Transformationsfunktionen konverterer billederne til tensor og normaliserer vรฆrdien. Funktionen torchvision.transforms.MNIST vil downloade datasรฆttet (hvis det ikke er tilgรฆngeligt) i biblioteket, indstille datasรฆttet til trรฆning om nรธdvendigt og udfรธre transformationsprocessen.
For at visualisere datasรฆttet bruger du data_iterator til at fรฅ den nรฆste batch af billeder og etiketter. Du bruger matplot til at plotte disse billeder og deres passende etiket. Som du kan se nedenfor vores billeder og deres etiketter.
Trin 2) Konfiguration af netvรฆrksmodel
Nu i denne PyTorch eksempel, du vil lave et simpelt neuralt netvรฆrk til PyTorch-billedklassificering.
Her introducerer vi dig til en anden mรฅde at oprette netvรฆrksmodellen i PyTorkap. Vi vil bruge nn.Sequential til at lave en sekvensmodel i stedet for at lave en underklasse af 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)
Her er output fra vores netvรฆrksmodel
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() )
Netvรฆrksforklaring
- Sekvensen er, at det fรธrste lag er et Conv2D-lag med en input-form pรฅ 1 og output-form pรฅ 10 med en kernestรธrrelse pรฅ 5
- Dernรฆst har du et MaxPool2D-lag
- En ReLU aktiveringsfunktion
- et Dropout-lag for at droppe lave sandsynlighedsvรฆrdier.
- Derefter en anden Conv2d med input-formen pรฅ 10 fra det sidste lag og output-formen pรฅ 20 med en kernestรธrrelse pรฅ 5
- Dernรฆst et MaxPool2d-lag
- ReLU aktiveringsfunktion.
- Derefter vil du flade tensoren, fรธr du fรธrer den ind i det lineรฆre lag
- Linear Layer vil kortlรฆgge vores output pรฅ det andet Lineรฆre lag med softmax aktiveringsfunktion
Trin 3) Trรฆn modellen
Fรธr du starter trรฆningsprocessen, er det nรธdvendigt at opsรฆtte kriteriet og optimeringsfunktionen.
Som kriterium bruger du CrossEntropyLoss. Som optimizer bruger du SGD med en lรฆringsrate pรฅ 0.001 og et momentum pรฅ 0.9, som vist i Py-diagrammet nedenfor.Torch eksempel.
import torch.optim as optim criterion = nn.CrossEntropyLoss() optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)
Fremadgรฅende proces vil tage inputformen og videregive den til det fรธrste conv2d-lag. Derefter vil den blive fรธrt ind i maxpool2d og til sidst sat ind i ReLU-aktiveringsfunktionen. Den samme proces vil forekomme i det andet conv2d-lag. Derefter omformes inputtet til (-1,320) og fรธres ind i fc-laget for at forudsige outputtet.
Nu vil du starte trรฆningsprocessen. Du vil gentage vores datasรฆt 2 gange eller med en epoke pรฅ 2 og udskrive det aktuelle tab for hver 2000 batch.
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
Ved hver epoke vil tรฆlleren fรฅ den nรฆste tuple af input og tilsvarende etiketter. Fรธr vi leverer input til vores netvรฆrksmodel, skal vi rydde den forrige gradient. Dette er pรฅkrรฆvet, fordi gradienten vil blive akkumuleret i stedet for at blive erstattet efter baglรฆns processen (tilbageudbredelsesprocessen). Derefter vil vi beregne tabene fra det forudsagte output fra det forventede output. Derefter vil vi lave en backpropagation for at beregne gradienten, og til sidst opdaterer vi parametrene.
Her er resultatet af trรฆningsprocessen
[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
Trin 4) Test modellen
Nรฅr du har trรฆnet vores model, skal du teste eller evaluere med andre sรฆt billeder.
Vi vil bruge en iterator til test_loader, og den vil generere en batch af billeder og etiketter, som vil blive videregivet til den trรฆnede model. Det forudsagte output vil blive vist og sammenlignet med det forventede output.
#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()










