Tutorial PyTorch
Rezumatul tutorialului Pytorch
รn acest tutorial pytorch, veศi รฎnvฤศa toate conceptele de la zero. Acest tutorial acoperฤ subiecte de la bazฤ pรขnฤ la avansate, cum ar fi definiศia pytorch, avantajele ศi dezavantajele pytorch, compararea, instalarea, cadrul pytorch, regresia ศi clasificarea imaginilor. Acest tutorial pytorch este absolut gratuit.
Ce este PyTorch?
PyTorch este o bibliotecฤ de รฎnvฤศare automatฤ bazatฤ pe Torch cu sursฤ deschisฤ pentru utilizarea procesฤrii limbajului natural Python. Este similar cu NumPy, dar cu suport puternic GPU. Oferฤ grafice computaศionale dinamice pe care le puteศi modifica din mers cu ajutorul autogradului. PyTorch este, de asemenea, mai rapid decรขt alte cadre. A fost dezvoltat de Grupul de cercetare AI al Facebook รฎn 2016.
Avantajele ศi dezavantajele PyTorch
Urmฤtoarele sunt avantajele ศi dezavantajele PyTorch:
Avantajele PyTorch
- Biblioteca simplฤ
Codul PyTorch este simplu. Este uศor de รฎnศeles ศi utilizaศi biblioteca instantaneu. De exemplu, aruncaศi 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 imagine: Exploring Deep Learning cu PyTorch
Pytorch oferฤ Dynamic Computational Graph (DAG). Graficele computaศionale reprezintฤ o modalitate de a exprima expresii matematice รฎn modele de grafice sau รฎn teorii, cum ar fi nodurile ศi muchiile. Nodul va face 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 cadru รฎ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 se bazeazฤ mai mult pe python. De exemplu, dacฤ doriศi sฤ antrenaศi un model, puteศi utiliza fluxul de control nativ, cum ar fi bucla ศi recursiuni, 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 instruire.
Pytorch implementeazฤ ศi programarea imperativฤ ศi este cu siguranศฤ mai flexibil. Deci, este posibil sฤ tipฤriศi 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.
รn continuare, รฎn acest tutorial PyTorch, vom afla despre diferenศa dintre PyTorch ศi TensorFlow.
PyTorch vs. Tensorflow
| Parametru | PyTorch | flux tensor |
|---|---|---|
| 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 |
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.
รn continuare, รฎn acest tutorial PyTorch, vom afla despre elementele de bazฤ ale cadrului PyTorch.
Noศiuni de bazฤ ale cadrului PyTorch
Sฤ รฎnvฤศฤm conceptele de bazฤ ale PyTorch รฎnainte de a ne arunca รฎn adรขncime. PyTorch foloseศte Tensor pentru fiecare variabilฤ similarฤ cu ndarray-ul lui 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 รฎncruciศatฤ pentru a rezolva o problemฤ de clasificare PyTorch cu mai multe clase. Este uศor sฤ definiศi funcศia de pierdere ศi sฤ calculaศi pierderile:
loss_fn = nn.CrossEntropyLoss() #training process loss = loss_fn(out, target)
Este uศor sฤ utilizaศi 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.
Regresie simplฤ cu PyTorch
Sฤ รฎnvฤศฤm regresia simplฤ cu exemple PyTorch:
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 exemplul de regresie PyTorch de mai jos.
# 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 efectuat cu succes regresia PyTorch cu o reศea neuronalฤ. De fapt, la fiecare iteraศie, linia roศie din diagramฤ se va actualiza ศi รฎศi va schimba poziศia pentru a se potrivi cu datele. Dar รฎn aceastฤ imagine, vฤ aratฤ doar rezultatul final, aศa cum se aratฤ รฎn exemplul PyTorch de mai jos:
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 primul pas al acestui exemplu de clasificare PyTorch, veศi รฎncฤrca setul de date folosind modulul torchvision.
รnainte de a รฎncepe procesul de formare, trebuie sฤ รฎnศelegeศi datele. Torchvision va รฎncฤrca setul de date ศi va transforma imaginile cu cerinศele adecvate 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 exemplu PyTorch, veศi crea o reศea neuronalฤ simplฤ pentru clasificarea imaginilor PyTorch.
Aici, vฤ prezentฤm o altฤ modalitate de a crea modelul de reศea รฎn PyTorch. Vom folosi nn.Sequential pentru a face un model de secvenศฤ รฎn loc sฤ facem o subclasฤ 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)
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 folosi CrossEntropyLoss. Pentru Optimizer, veศi folosi SGD cu o ratฤ de รฎnvฤศare de 0.001 ศi un impuls de 0.9, aศa cum se aratฤ รฎn exemplul PyTorch de mai jos.
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()
Rezumat
- PyTorch este un open-source bazat pe Torch Invatare mecanica biblioteca pentru prelucrarea limbajului natural folosind Python.
- Avantajele PyTorch: 1) Bibliotecฤ simplฤ, 2) Grafic de calcul dinamic, 3) Performanศฤ mai bunฤ, 4) Nativ Python
- PyTorch foloseศte Tensor pentru fiecare variabilฤ similarฤ cu ndarray-ul lui numpy, dar cu suport de calcul GPU.
- Una dintre metodele populare de a รฎnvฤศa elementele de bazฤ ale รฎnvฤศฤrii profunde este cu setul de date MNIST.










