PyTorch opetusohjelma
Pytorchin opetusohjelman yhteenveto
Tรคssรค pytorch-opetusohjelmassa opit kaikki kรคsitteet tyhjรคstรค. Tรคmรค opetusohjelma kattaa perus- ja edistykselliset aiheet, kuten pytorchin mรครคritelmรคn, pytorchin edut ja haitat, vertailun, asennuksen, pytorch-kehyksen, regression ja kuvien luokittelun. Tรคmรค pytorch-opetusohjelma on tรคysin ilmainen.
Mikรค on PyTorch?
PyTorch on avoimen lรคhdekoodin taskulamppupohjainen koneoppimiskirjasto luonnollisen kielen kรคsittelyyn Python. Se on samanlainen kuin NumPy, mutta siinรค on tehokas GPU-tuki. Se tarjoaa dynaamisia laskennallisia kuvaajia, joita voit muokata liikkeellรค ollessasi autogradin avulla. PyTorch on myรถs nopeampi kuin jotkut muut puitteet. Sen kehitti Facebookin AI Research Group vuonna 2016.
PyTorchin edut ja haitat
PyTorchin edut ja haitat ovat seuraavat:
PyTorchin edut
- Yksinkertainen kirjasto
PyTorch-koodi on yksinkertainen. Se on helppo ymmรคrtรครค, ja kรคytรคt kirjastoa vรคlittรถmรคsti. Katso esimerkiksi alla oleva koodinpรคtkรค:
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
Kuten edellรค mainittiin, voit mรครคrittรครค verkkomallin helposti ja ymmรคrrรคt koodin nopeasti ilman paljon harjoittelua.
- Dynaaminen laskennallinen kuvaaja
Kuvan lรคhde: Exploring Deep Learning with PyTorch
Pytorch tarjoaa Dynamic Computational Graph (DAG). Laskennalliset graafit ovat tapa ilmaista matemaattisia lausekkeita graafimalleissa tai teorioissa, kuten solmuissa ja reunoissa. Solmu suorittaa matemaattisen toiminnon, ja reuna on tensori, joka syรถtetรครคn solmuihin ja kuljettaa solmun lรคhtรถรค Tensorissa.
DAG on graafi, jolla on mielivaltainen muoto ja joka pystyy suorittamaan operaatioita eri syรถtekaavioiden vรคlillรค. Jokaisella iteraatiolla luodaan uusi kaavio. Joten on mahdollista kรคyttรครค samaa graafirakennetta tai luoda uusi graafi eri toiminnolla, tai voimme kutsua sitรค dynaamiseksi graafiksi.
- Parempi suorituskyky
Yhteisรถt ja tutkijat vertailemalla kehyksiรค nรคhdรคksesi kumpi on nopeampi. GitHub-repo Deep Learning Frameworks ja GPU:iden vertailu kertoi, ettรค PyTorch on nopeampi kuin toinen kehys sekunnissa kรคsiteltyjen kuvien suhteen.
Kuten alla nรคet, vertailukaaviot vgg16:n ja resnet152:n kanssa
- Syntyperรคinen Python
PyTorch on enemmรคn python-pohjainen. Jos esimerkiksi haluat kouluttaa mallin, voit kรคyttรครค natiivia ohjausvirtaa, kuten silmukoita ja rekursioita, ilman, ettรค sinun tarvitsee lisรคtรค erikoismuuttujia tai istuntoja niiden suorittamiseksi. Tรคmรค on erittรคin hyรถdyllistรค koulutusprosessissa.
Pytorch toteuttaa myรถs Imperative Programmingia, ja se on ehdottomasti joustavampi. Joten on mahdollista tulostaa tensoriarvo kesken laskentaprosessin.
PyTorchin haittapuoli
PyTorch vaatii kolmannen osapuolen sovelluksia visualisointiin. Se tarvitsee myรถs API-palvelimen tuotantoa varten.
Seuraavaksi tรคssรค PyTorch-opetusohjelmassa opimme erosta PyTorchin ja TensorFlow'n vรคlillรค.
PyTorch vs. Tensorflow
| Parametri | PyTorch | Tensorflow |
|---|---|---|
| Mallin mรครคritelmรค | Malli on mรครคritelty alaluokkaan ja tarjoaa helppokรคyttรถisen paketin | Malli on mรครคritelty monilla, ja sinun on ymmรคrrettรคvรค syntaksi |
| GPU-tuki | Kyllรค | Kyllรค |
| Kaaviotyyppi | Dynaaminen | Staattinen |
| Tyรถkalut | Ei visualisointityรถkalua | Voit kรคyttรครค Tensorboardin visualisointityรถkalua |
| yhteisรถ | Yhteisรถ kasvaa edelleen | Suuret aktiiviset yhteisรถt |
PyTorchin asennus
Linux
Sen asentaminen Linuxiin on helppoa. Voit kรคyttรครค virtuaalista ympรคristรถรค tai asentaa sen suoraan pรครคkรคyttรคjรคn oikeuksin. Kirjoita tรคmรค komento terminaaliin
pip3 install --upgrade torch torchvision
AWS Sagemaker
Sagemaker on yksi alustoista Amazon Web-palvelu joka tarjoaa tehokkaan koneoppimismoottorin esiasennetuilla syvรคoppimiskokoonpanoilla datatieteilijรถille tai kehittรคjille, jotka voivat rakentaa, kouluttaa ja ottaa kรคyttรถรถn malleja missรค tahansa mittakaavassa.
Avaa ensin Amazon Sagemaker konsoli ja napsauta Luo muistikirjan esiintymรค ja tรคytรค kaikki muistikirjasi tiedot.
Seuraava vaihe, napsauta Avaa kรคynnistรครคksesi muistikirjan ilmentymรค.
Lopuksi In Jupyter, Napsauta Uusi ja valitse conda_pytorch_p36 ja olet valmis kรคyttรคmรครคn muistikirjaasi Pytorchin asennettuna.
Seuraavaksi tรคssรค PyTorch-opetusohjelmassa opimme PyTorch-kehyksen perusteet.
PyTorch Frameworkin perusteet
Opitaan PyTorchin peruskรคsitteet ennen kuin sukellamme syvรคlle. PyTorch kรคyttรครค Tensoria jokaiselle muuttujalle, joka on samanlainen kuin numpy's ndarray, mutta jossa on GPU-laskentatuki. Tรคssรค selitetรครคn verkkomalli, hรคviรถtoiminto, Backprop ja Optimizer.
Verkkomalli
Verkko voidaan rakentaa alaluokittamalla taskulamppu.nn. Siinรค on 2 pรครคosaa,
- Ensimmรคinen osa on mรครคrittรครค kรคytettรคvรคt parametrit ja tasot
- Toinen osa on pรครคtehtรคvรค, jota kutsutaan eteenpรคin prosessiksi, joka ottaa syรถtteen ja ennustaa lรคhdรถn.
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()
Kuten yllรค nรคet, luot nn.Module-luokan nimeltรค Model. Se sisรคltรครค 2 Conv2d-tasoa ja lineaarisen kerroksen. Ensimmรคinen conv2d-kerros ottaa syรถttรถarvon 3 ja ulostulomuodon 20. Toinen kerros ottaa syรถttรถarvon 20 ja tuottaa tulosteen muodon 40. Viimeinen kerros on tรคysin yhdistetty kerros, jonka muoto on 320 ja tuottaa lรคhtรถ 10.
Vรคlitysprosessi ottaa X:n syรถtteen ja syรถttรครค sen conv1-kerrokseen ja suorittaa ReLU-toiminnon,
Samalla tavalla se syรถttรครค myรถs conv2-kerroksen. Sen jรคlkeen x muotoillaan uudelleen muotoon (-1, 320) ja syรถtetรครคn lopulliseen FC-kerrokseen. Ennen kuin lรคhetรคt lรคhdรถn, kรคytรคt softmax-aktivointitoimintoa.
Autograd mรครคrittelee taaksepรคin prosessin automaattisesti, joten sinun tarvitsee vain mรครคrittรครค eteenpรคin prosessi.
Menetystoiminto
Hรคviรถfunktiota kรคytetรครคn mittaamaan, kuinka hyvin ennustemalli pystyy ennustamaan odotetut tulokset. PyTorchilla on jo useita vakiohรคviรถtoimintoja torch.nn-moduulissa. Voit esimerkiksi kรคyttรครค Cross-Entropy Loss -toimintoa ratkaistaksesi moniluokkaisen PyTorch-luokitusongelman. Hรคviรถfunktion mรครคrittรคminen ja hรคviรถiden laskeminen on helppoa:
loss_fn = nn.CrossEntropyLoss() #training process loss = loss_fn(out, target)
PyTorchin avulla on helppo kรคyttรครค omaa tappiofunktiolaskelmaa.
Backprop
Suorittaaksesi backpropagation, sinun tarvitsee vain kutsua los.backward(). Virhe lasketaan, mutta muista tyhjentรครค olemassa oleva gradientti komennolla zero_grad()
net.zero_grad() # to clear the existing gradient loss.backward() # to perform backpropragation
Optimizer
Torch.optim tarjoaa yleisiรค optimointialgoritmeja. Voit mรครคrittรครค optimoijan yksinkertaisella vaiheella:
optimizer = torch.optim.SGD(net.parameters(), lr = 0.01, momentum=0.9)
Sinun on vรคlitettรคvรค verkkomallin parametrit ja oppimisnopeus, jotta parametrit pรคivitetรครคn jokaisessa iteraatiossa backprop-prosessin jรคlkeen.
Yksinkertainen regressio PyTorchin avulla
Opitaan yksinkertainen regressio PyTorch-esimerkeillรค:
Vaihe 1) Verkkomallimme luominen
Verkkomallimme on yksinkertainen lineaarinen kerros, jonka tulo- ja lรคhtรถmuoto on 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)
Ja verkon lรคhdรถn pitรคisi olla tรคllainen
Net( (hidden): Linear(in_features=1, out_features=1, bias=True) )
Vaihe 2) Testitiedot
Ennen kuin aloitat koulutusprosessin, sinun on tiedettรคvรค tietomme. Teet satunnaisen funktion mallimme testaamiseksi. 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()
Tรคssรค on funktiomme hajontakaavio:
Ennen kuin aloitat harjoitusprosessin, sinun on muutettava numpy-taulukko muuttujiksi, joita Torch ja autograd tukevat alla olevan PyTorchin regressioesimerkin mukaisesti.
# 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)
Vaihe 3) Optimoija ja hรคviรถ
Seuraavaksi sinun tulee mรครคrittรครค koulutusprosessimme Optimizer ja Loss Function.
# Define Optimizer and Loss Function optimizer = torch.optim.SGD(net.parameters(), lr=0.2) loss_func = torch.nn.MSELoss()
Vaihe 4) Koulutus
Aloitetaan nyt koulutusprosessimme. 250:n aikakaudella toistat tietojamme lรถytรครคksesi parhaan arvon hyperparametreillemme.
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()
Vaihe 5) Tulos
Kuten alla nรคet, suoritit PyTorch-regression onnistuneesti hermoverkon kanssa. Itse asiassa jokaisessa iteraatiossa kaavion punainen viiva pรคivittyy ja muuttaa sijaintiaan tietojen mukaan. Mutta tรคssรค kuvassa se nรคyttรครค vain lopputuloksen, kuten alla olevassa PyTorch-esimerkissรค:
Esimerkki kuvien luokittelusta PyTorchilla
Yksi suosituimmista tavoista oppia perusasiat syvรค oppiminen on MNIST-tietojoukon kanssa. Se on "Hei maailma" syvรคssรค oppimisessa. Tietojoukko sisรคltรครค kรคsinkirjoitettuja numeroita 0โ9, yhteensรค 60,000 10,000 harjoitusnรคytettรค ja 28 28 testinรคytettรค, jotka on jo merkitty kooltaan XNUMX ร XNUMX pikseliรค.
Vaihe 1) Esikรคsittele tiedot
Tรคmรคn PyTorch-luokitusesimerkin ensimmรคisessรค vaiheessa lataat tietojoukon kรคyttรคmรคllรค torchvision-moduulia.
Ennen kuin aloitat koulutusprosessin, sinun on ymmรคrrettรคvรค tiedot. Torchvision lataa tietojoukon ja muuntaa kuvat verkkoa koskevien vaatimusten mukaan, kuten kuvien muodon ja normalisoinnin.
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()
Muunnostoiminto muuntaa kuvat tensoriksi ja normalisoi arvon. Funktio torchvision.transforms.MNIST lataa tietojoukon (jos se ei ole saatavilla) hakemistoon, asettaa tietojoukon tarvittaessa koulutukseen ja suorittaa muunnosprosessin.
Tietojoukon visualisoimiseksi kรคytรคt data_iteraattoria saadaksesi seuraavan erรคn kuvia ja tarroja. Kรคytรคt matplotia nรคiden kuvien piirtรคmiseen ja niiden asianmukaiseen etikettiin. Kuten nรคet alla kuvamme ja niiden etiketit.
Vaihe 2) Verkkomallin mรครคritys
Nyt tรคssรค PyTorch-esimerkissรค teet yksinkertaisen hermoverkon PyTorch-kuvien luokittelua varten.
Tรคssรค esittelemme sinulle toisen tavan luoda verkkomalli PyTorchissa. Kรคytรคmme nn.Sequentialia sekvenssimallin tekemiseen sen sijaan, ettรค tekisimme nn.Module-aliluokan.
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)
Tรคssรค on verkkomallimme tulos
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() )
Verkkoselitys
- Jรคrjestys on, ettรค ensimmรคinen kerros on Conv2D-kerros, jonka tulomuoto on 1 ja lรคhtรถmuoto 10 ja ytimen koko 5
- Seuraavaksi sinulla on MaxPool2D-taso
- ReLU-aktivointitoiminto
- Dropout-kerros pienen todennรคkรถisyyden arvojen pudottamiseksi.
- Sitten toinen Conv2d, jonka syรถttรถmuoto on 10 viimeisestรค kerroksesta ja lรคhtรถmuoto 20, ytimen koolla 5
- Seuraavaksi MaxPool2d-taso
- ReLU aktivointitoiminto.
- Tรคmรคn jรคlkeen tasoitat tensorin ennen kuin syรถtรคt sen Lineaarikerrokseen
- Linear Layer kartoittaa tulostemme toisessa Lineaarisessa kerroksessa softmax-aktivointitoiminnolla
Vaihe 3) Kouluta malli
Ennen kuin aloitat harjoitusprosessin, sinun on mรครคritettรคvรค kriteeri ja optimointitoiminto.
Kriteerinรค kรคytรคt CrossEntropyLossia. Optimoijassa kรคytรคt SGD:tรค oppimisnopeudella 0.001 ja vauhdilla 0.9, kuten alla olevassa PyTorch-esimerkissรค nรคkyy.
import torch.optim as optim criterion = nn.CrossEntropyLoss() optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)
Vรคlitysprosessi ottaa syรถtemuodon ja vรคlittรครค sen ensimmรคiselle conv2d-kerrokselle. Sieltรค se syรถtetรครคn maxpool2d:hen ja lopulta ReLU-aktivointitoimintoon. Sama prosessi tapahtuu toisessa conv2d-kerroksessa. Sen jรคlkeen syรถte muotoillaan uudelleen muotoon (-1,320 XNUMX) ja syรถtetรครคn fc-kerrokseen lรคhdรถn ennustamiseksi.
Nyt aloitat koulutusprosessin. Toistat tietojoukkomme lรคpi 2 kertaa tai 2 jaksolla ja tulostat nykyisen hรคviรถn joka 2000 erรคn vรคlein.
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
Jokaisella aikakaudella luetteloija saa seuraavan syรถtteen ja vastaavat nimikkeet. Ennen kuin syรถtรคmme syรถtteen verkkomalliimme, meidรคn on tyhjennettรคvรค edellinen gradientti. Tรคmรค on tarpeen, koska taaksepรคin prosessin (backpropagation) jรคlkeen gradientti kertyy sen sijaan, ettรค se korvattaisiin. Sitten laskemme hรคviรถt ennustetusta tuotosta odotetusta tuotosta. Sen jรคlkeen teemme backpropagation laskeaksemme gradientin ja lopuksi pรคivitรคmme parametrit.
Tรคssรค harjoitusprosessin tulos
[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
Vaihe 4) Testaa malli
Kun olet kouluttanut mallimme, sinun on testattava tai arvioitava muilla kuvasarjoilla.
Kรคytรคmme iteraattoria test_loaderille, ja se luo joukon kuvia ja tarroja, jotka vรคlitetรครคn koulutetulle mallille. Ennustettu tulos nรคytetรครคn ja sitรค verrataan odotettuun tehoon.
#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()
Yhteenveto
- PyTorch on avoimen lรคhdekoodin Torch-pohjainen Koneen oppiminen kirjasto varten luonnollinen kielenkรคsittely kรคyttรคmรคllรค Python.
- PyTorchin edut: 1) yksinkertainen kirjasto, 2) dynaaminen laskennallinen kaavio, 3) parempi suorituskyky, 4) natiivi Python
- PyTorch kรคyttรครค Tensoria jokaiselle muuttujalle, joka on samanlainen kuin numpy's ndarray, mutta jossa on GPU-laskentatuki.
- Yksi suosituimmista tavoista oppia syvรคn oppimisen perusteet on MNIST-tietojoukko.










