PyTorch handledning
Pytorch Tutorial Sammanfattning
I denna pytorch-handledning kommer du att lรคra dig alla begrepp frรฅn grunden. Denna handledning tรคcker grundlรคggande till avancerade รคmnen som pytorch-definition, fรถrdelar och nackdelar med pytorch, jรคmfรถrelse, installation, pytorch-ramverk, regression och bildklassificering. Denna pytorch-handledning รคr helt gratis.
Vad รคr PyTorch?
PyTorch รคr ett Torch-baserat maskininlรคrningsbibliotek med รถppen kรคllkod fรถr naturlig sprรฅkbehandling Python. Det liknar NumPy men med kraftfullt GPU-stรถd. Den erbjuder Dynamic Computational Graphs som du kan modifiera nรคr du รคr pรฅ sprรฅng med hjรคlp av autograd. PyTorch รคr ocksรฅ snabbare รคn vissa andra ramverk. Det utvecklades av Facebooks AI Research Group 2016.
PyTorch fรถrdelar och nackdelar
Fรถljande รคr fรถrdelarna och nackdelarna med PyTorch:
Fรถrdelar med PyTorch
- Enkelt bibliotek
PyTorch-koden รคr enkel. Det รคr lรคtt att fรถrstรฅ och du anvรคnder biblioteket direkt. Ta till exempel en titt pรฅ kodavsnittet nedan:
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รคmnts ovan kan du enkelt definiera nรคtverksmodellen och du kan fรถrstรฅ koden snabbt utan mycket trรคning.
- Dynamisk berรคkningsgraf
Bildkรคlla: Exploring Deep Learning med PyTorch
Pytorch erbjuder Dynamic Computational Graph (DAG). Berรคkningsgrafer รคr ett sรคtt att uttrycka matematiska uttryck i grafmodeller eller teorier som noder och kanter. Noden kommer att utfรถra den matematiska operationen, och kanten รคr en Tensor som kommer att matas in i noderna och bรคr utdata frรฅn noden i Tensor.
DAG รคr en graf som hรฅller godtycklig form och kan utfรถra operationer mellan olika inmatningsgrafer. Varje iteration skapas en ny graf. Sรฅ det รคr mรถjligt att ha samma grafstruktur eller skapa en ny graf med en annan operation, eller sรฅ kan vi kalla det en dynamisk graf.
- Bรคttre prestanda
Gemenskaper och forskare, benchmark och jรคmfรถr ramverk fรถr att se vilken som รคr snabbare. En GitHub-repo Benchmark pรฅ Deep Learning Frameworks och GPU:er rapporterade att PyTorch รคr snabbare รคn det andra ramverket nรคr det gรคller bilder bearbetade per sekund.
Som du kan se nedan visar jรคmfรถrelsegraferna med vgg16 och resnet152
- Native Python
PyTorch รคr mer pythonbaserat. Om du till exempel vill trรคna en modell kan du anvรคnda native control flow som looping och rekursioner utan att behรถva lรคgga till fler speciella variabler eller sessioner fรถr att kunna kรถra dem. Detta รคr mycket anvรคndbart fรถr utbildningsprocessen.
Pytorch implementerar ocksรฅ imperativ programmering, och det รคr definitivt mer flexibelt. Sรฅ det รคr mรถjligt att skriva ut tensorvรคrdet mitt i en berรคkningsprocess.
Nackdelen med PyTorch
PyTorch krรคver tredjepartsapplikationer fรถr visualisering. Den behรถver ocksรฅ en API-server fรถr produktion.
Nรคsta i denna PyTorch-handledning kommer vi att lรคra oss om skillnaden mellan PyTorch och TensorFlow.
PyTorch vs. Tensorflรถde
| Parameter | PyTorch | Tensorflรถde |
|---|---|---|
| Modelldefinition | Modellen รคr definierad i en underklass och erbjuder ett lรคttanvรคnt paket | Modellen รคr definierad med mรฅnga, och du mรฅste fรถrstรฅ syntaxen |
| GPU-support | Ja | Ja |
| Graftyp | Dynamisk | Statisk |
| verktyg | Inget visualiseringsverktyg | Du kan anvรคnda Tensorboard visualiseringsverktyg |
| Community | Samhรคllet vรคxer fortfarande | Stora aktiva samhรคllen |
Installerar PyTorch
Linux
Det รคr enkelt att installera det i Linux. Du kan vรคlja att anvรคnda en virtuell miljรถ eller installera den direkt med root-รฅtkomst. Skriv detta kommando i terminalen
pip3 install --upgrade torch torchvision
AWS Sagemaker
Sagemaker รคr en av plattformarna i Amazon Webbtjรคnst som erbjuder en kraftfull maskininlรคrningsmotor med fรถrinstallerade djupinlรคrningskonfigurationer fรถr datavetare eller utvecklare att bygga, trรคna och distribuera modeller i vilken skala som helst.
รppna fรถrst Amazon Sagemaker konsolen och klicka pรฅ Skapa anteckningsbokfรถrekomst och fyll i alla detaljer fรถr din anteckningsbok.
Nรคsta steg, klicka pรฅ รppna fรถr att starta din anteckningsbokfรถrekomst.
Slutligen, In Jupyter, Klicka pรฅ Ny och vรคlj conda_pytorch_p36 och du รคr redo att anvรคnda din notebook-instans med Pytorch installerad.
Nรคsta i denna PyTorch-handledning kommer vi att lรคra oss om PyTorch-ramverkets grunder.
Grunderna i PyTorch Framework
Lรฅt oss lรคra oss de grundlรคggande begreppen PyTorch innan vi djupdyker. PyTorch anvรคnder Tensor fรถr varje variabel som liknar numpys ndarray men med stรถd fรถr GPU-berรคkning. Hรคr kommer vi att fรถrklara nรคtverksmodellen, fรถrlustfunktionen, Backprop och Optimizer.
Nรคtverksmodell
Nรคtverket kan konstrueras genom att underklassa torch.nn. Det finns 2 huvuddelar,
- Den fรถrsta delen รคr att definiera parametrarna och lagren som du ska anvรคnda
- Den andra delen รคr huvuduppgiften som kallas framรฅtprocessen som tar en input och fรถrutsรคger utdata.
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 ovan skapar du en klass av nn.Module som heter Model. Den innehรฅller 2 Conv2d-lager och ett linjรคrt lager. Det fรถrsta conv2d-lagret har en ingรฅng pรฅ 3 och utmatningsformen 20. Det andra lagret kommer att ta en ingรฅng pรฅ 20 och producerar en outputform pรฅ 40. Det sista lagret รคr ett helt anslutet lager i formen 320 och kommer att producera en utgรฅng pรฅ 10.
Framรฅtprocessen kommer att ta en ingรฅng av X och mata den till konv1-lagret och utfรถra ReLU-funktion,
Pรฅ samma sรคtt kommer det ocksรฅ att mata konv2-lagret. Efter det kommer x:et att omformas till (-1, 320) och matas in i det sista FC-lagret. Innan du skickar utdata kommer du att anvรคnda softmax-aktiveringsfunktionen.
Bakรฅtprocessen definieras automatiskt av autograd, sรฅ du behรถver bara definiera framรฅtprocessen.
Fรถrlustfunktion
Fรถrlustfunktionen anvรคnds fรถr att mรคta hur vรคl prediktionsmodellen kan fรถrutsรคga de fรถrvรคntade resultaten. PyTorch har redan mรฅnga vanliga fรถrlustfunktioner i torch.nn-modulen. Till exempel kan du anvรคnda Cross-Entropy Loss fรถr att lรถsa ett PyTorch-klassificeringsproblem i flera klasser. Det รคr enkelt att definiera fรถrlustfunktionen och berรคkna fรถrlusterna:
loss_fn = nn.CrossEntropyLoss() #training process loss = loss_fn(out, target)
Det รคr enkelt att anvรคnda din egen fรถrlustfunktionsberรคkning med PyTorch.
Backprop
Fรถr att utfรถra backpropagation, anropar du helt enkelt los.backward(). Felet kommer att berรคknas men kom ihรฅg att rensa den befintliga gradienten med zero_grad()
net.zero_grad() # to clear the existing gradient loss.backward() # to perform backpropragation
Optimizer
Torch.optim tillhandahรฅller vanliga optimeringsalgoritmer. Du kan definiera en optimerare med ett enkelt steg:
optimizer = torch.optim.SGD(net.parameters(), lr = 0.01, momentum=0.9)
Du mรฅste skicka nรคtverksmodellens parametrar och inlรคrningshastigheten sรฅ att parametrarna uppdateras vid varje iteration efter backprop-processen.
Enkel regression med PyTorch
Lรฅt oss lรคra oss enkel regression med PyTorch-exempel:
Steg 1) Skapa vรฅr nรคtverksmodell
Vรฅr nรคtverksmodell รคr ett enkelt linjรคrt lager med en ingรฅngs- och en utgรฅngsform 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)
Och nรคtverksutgรฅngen ska vara sรฅ hรคr
Net( (hidden): Linear(in_features=1, out_features=1, bias=True) )
Steg 2) Testa data
Innan du pรฅbรถrjar utbildningsprocessen mรฅste du kรคnna till vรฅra uppgifter. Du gรถr en slumpmรคssig funktion fรถr att testa vรฅr modell. 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()
Hรคr รคr spridningsdiagrammet fรถr vรฅr funktion:
Innan du startar trรคningsprocessen mรฅste du konvertera numpy-arrayen till variabler som stรถds av Torch och autograd som visas i PyTorch-regressionsexemplet nedan.
# 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)
Steg 3) Optimizer och fรถrlust
Dรคrefter bรถr du definiera optimeraren och fรถrlustfunktionen fรถr vรฅr trรคningsprocess.
# Define Optimizer and Loss Function optimizer = torch.optim.SGD(net.parameters(), lr=0.2) loss_func = torch.nn.MSELoss()
Steg 4) Trรคning
Lรฅt oss nu bรถrja vรฅr trรคningsprocess. Med en epok pรฅ 250, kommer du att iterera vรฅra data fรถr att hitta det bรคsta vรคrdet fรถr vรฅra hyperparametrar.
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()
Steg 5) Resultat
Som du kan se nedan har du framgรฅngsrikt utfรถrt PyTorch-regression med ett neuralt nรคtverk. Faktiskt, vid varje iteration kommer den rรถda linjen i diagrammet att uppdateras och รคndra sin position fรถr att passa data. Men i den hรคr bilden visar den bara det slutliga resultatet som visas i PyTorch-exemplet nedan:
Bildklassificeringsexempel med PyTorch
En av de populรคra metoderna att lรคra sig grunderna i djupt lรคrande รคr med MNIST-datauppsรคttningen. Det รคr "Hej vรคrlden" inom djupinlรคrning. Datauppsรคttningen innehรฅller handskrivna siffror frรฅn 0 โ 9 med totalt 60,000 10,000 trรคningsprover och 28 28 testprover som redan รคr mรคrkta med storleken XNUMXรXNUMX pixlar.
Steg 1) Fรถrbearbeta data
I det fรถrsta steget i detta PyTorch-klassificeringsexempel kommer du att ladda datamรคngden med hjรคlp av torchvision-modulen.
Innan du bรถrjar utbildningsprocessen mรฅste du fรถrstรฅ data. Torchvision kommer att ladda datamรคngden och transformera bilderna med lรคmpliga krav fรถr nรคtverket sรฅsom formen och normalisering av bilderna.
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()
Transformfunktionen omvandlar bilderna till tensor och normaliserar vรคrdet. Funktionen torchvision.transforms.MNIST laddar ner datasetet (om det inte รคr tillgรคngligt) i katalogen, stรคller in datasetet fรถr trรคning om det behรถvs och gรถr omvandlingsprocessen.
Fรถr att visualisera datamรคngden anvรคnder du data_iterator fรถr att fรฅ nรคsta sats med bilder och etiketter. Du anvรคnder matplot fรถr att plotta dessa bilder och deras lรคmpliga etikett. Som du kan se nedan vรฅra bilder och deras etiketter.
Steg 2) Konfiguration av nรคtverksmodell
Nu i detta PyTorch-exempel kommer du att skapa ett enkelt neuralt nรคtverk fรถr PyTorch-bildklassificering.
Hรคr presenterar vi ett annat sรคtt att skapa nรคtverksmodellen i PyTorch. Vi kommer att anvรคnda nn.Sequential fรถr att gรถra en sekvensmodell istรคllet fรถr att gรถra en underklass till 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)
Hรคr รคr resultatet av vรฅr nรคtverksmodell
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() )
Nรคtverksfรถrklaring
- Sekvensen รคr att det fรถrsta lagret รคr ett Conv2D-lager med en ingรฅngsform pรฅ 1 och en utmatningsform pรฅ 10 med en kรคrnstorlek pรฅ 5
- Dรคrefter har du ett MaxPool2D-lager
- En ReLU-aktiveringsfunktion
- ett Dropout-lager fรถr att slรคppa lรฅga sannolikhetsvรคrden.
- Sedan en andra Conv2d med ingรฅngsformen 10 frรฅn det sista lagret och utgรฅngsformen 20 med en kรคrnstorlek pรฅ 5
- Nรคsta ett MaxPool2d-lager
- ReLU aktiveringsfunktion.
- Efter det kommer du att platta till tensorn innan du matar in den i det linjรคra lagret
- Linear Layer kommer att kartlรคgga vรฅr utdata vid det andra linjรคra lagret med softmax aktiveringsfunktion
Steg 3) Trรคna modellen
Innan du startar utbildningsprocessen krรคvs det att du stรคller in kriteriet och optimeringsfunktionen.
Fรถr kriteriet kommer du att anvรคnda CrossEntropyLoss. Fรถr Optimizer kommer du att anvรคnda SGD med en inlรคrningshastighet pรฅ 0.001 och ett momentum pรฅ 0.9 som visas i PyTorch-exemplet nedan.
import torch.optim as optim criterion = nn.CrossEntropyLoss() optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)
Framรฅtprocessen kommer att ta ingรฅngsformen och skicka den till det fรถrsta conv2d-lagret. Sedan kommer den att matas in i maxpool2d och slutligen fรถras in i ReLU-aktiveringsfunktionen. Samma process kommer att ske i det andra conv2d-lagret. Efter det kommer ingรฅngen att omformas till (-1,320 XNUMX) och matas in i fc-lagret fรถr att fรถrutsรคga utdata.
Nu bรถrjar du trรคningsprocessen. Du kommer att gรฅ igenom vรฅr datauppsรคttning 2 gรฅnger eller med en epok pรฅ 2 och skriva ut den aktuella fรถrlusten var 2000:e 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
Vid varje epok kommer enumeratorn att fรฅ nรคsta tupel av input och motsvarande etiketter. Innan vi matar ingรฅngen till vรฅr nรคtverksmodell mรฅste vi rensa den fรถregรฅende gradienten. Detta krรคvs eftersom efter bakรฅtprocessen (รฅterfรถrรถkningsprocessen) kommer gradienten att ackumuleras istรคllet fรถr att ersรคttas. Sedan kommer vi att berรคkna fรถrlusterna frรฅn den fรถrvรคntade produktionen frรฅn den fรถrvรคntade produktionen. Efter det kommer vi att gรถra en backpropagation fรถr att berรคkna gradienten, och slutligen kommer vi att uppdatera parametrarna.
Hรคr รคr resultatet av utbildningsprocessen
[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
Steg 4) Testa modellen
Nรคr du har trรคnat vรฅr modell mรฅste du testa eller utvรคrdera med andra uppsรคttningar bilder.
Vi kommer att anvรคnda en iterator fรถr test_loader, och den kommer att generera en grupp bilder och etiketter som kommer att skickas till den trรคnade modellen. Den fรถrvรคntade uteffekten kommer att visas och jรคmfรถras med den fรถrvรคntade uteffekten.
#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()
Sammanfattning
- PyTorch รคr en Torch-baserad med รถppen kรคllkod Maskininlรคrning bibliotek fรถr naturlig sprรฅkbehandling med hjรคlp av Python.
- Fรถrdelar med PyTorch: 1) Enkelt bibliotek, 2) Dynamic Computational Graph, 3) Bรคttre prestanda, 4) Native Python
- PyTorch anvรคnder Tensor fรถr varje variabel som liknar numpys ndarray men med stรถd fรถr GPU-berรคkning.
- En av de populรคra metoderna fรถr att lรคra sig grunderna fรถr djupinlรคrning รคr med MNIST-datauppsรคttningen.










