Poradnik PyTorcha
Podsumowanie samouczka Pytorcha
W tym samouczku pytorch nauczysz siฤ wszystkich pojฤฤ od podstaw. Ten samouczek obejmuje podstawowe i zaawansowane tematy, takie jak definicja pytorch, zalety i wady pytorch, porรณwnanie, instalacja, framework pytorch, regresja i klasyfikacja obrazรณw. Ten samouczek pytorch jest caลkowicie darmowy.
Co to jest PyTorch?
PyTorch to biblioteka uczenia maszynowego oparta na technologii Torch typu open source, sลuลผฤ ca do przetwarzania jฤzyka naturalnego Python. Jest podobny do NumPy, ale z potฤลผnฤ obsลugฤ GPU. Oferuje dynamiczne wykresy obliczeniowe, ktรณre moลผna modyfikowaฤ w dowolnym miejscu za pomocฤ autogradu. PyTorch jest takลผe szybszy niลผ niektรณre inne frameworki. Zostaล opracowany przez grupฤ badawczฤ AI Facebooka w 2016 roku.
Zalety i wady PyTorcha
Oto zalety i wady PyTorch:
Zalety PyTorcha
- Prosta biblioteka
Kod PyTorch jest prosty. Jest ลatwy do zrozumienia i natychmiast korzystasz z biblioteki. Na przykลad spรณjrz na poniลผszy fragment kodu:
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
Jak wspomniano powyลผej, moลผesz ลatwo zdefiniowaฤ model sieci i szybko zrozumieฤ kod, bez wiฤkszego szkolenia.
- Dynamiczny wykres obliczeniowy
ลนrรณdลo obrazu: Odkrywanie gลฤbokiego uczenia siฤ za pomocฤ PyTorch
Pytorch oferuje Dynamic Computational Graph (DAG). Grafy obliczeniowe to sposรณb wyraลผania wyraลผeล matematycznych w modelach grafรณw lub teoriach, takich jak wฤzลy i krawฤdzie. Wฤzeล wykona operacjฤ matematycznฤ , a krawฤdลบ jest Tensorem, ktรณry zostanie wprowadzony do wฤzลรณw i przeniesie dane wyjลciowe wฤzลa w Tensorze.
DAG to graf, ktรณry przyjmuje dowolny ksztaลt i moลผe wykonywaฤ operacje miฤdzy rรณลผnymi grafami wejลciowymi. Kaลผda iteracja tworzy nowy graf. Tak wiฤc moลผliwe jest posiadanie tej samej struktury grafu lub utworzenie nowego grafu z innฤ operacjฤ , lub moลผemy nazwaฤ go grafem dynamicznym.
- Lepsza wydajnoลฤ
Spoลecznoลci i badacze dokonujฤ testรณw porรณwnawczych i porรณwnujฤ platformy, aby zobaczyฤ, ktรณra z nich jest szybsza. Repozytorium GitHub Test porรณwnawczy platform gลฤbokiego uczenia siฤ i procesorรณw graficznych zgลosiลo, ลผe PyTorch jest szybszy niลผ inne platformy pod wzglฤdem obrazรณw przetwarzanych na sekundฤ.
Jak widaฤ poniลผej, wykresy porรณwnawcze z vgg16 i resnet152
- Tubylec Python
PyTorch jest bardziej oparty na Pythonie. Na przykลad, jeลli chcesz wytrenowaฤ model, moลผesz uลผyฤ natywnego przepลywu sterowania, takiego jak pฤtle i rekurencje, bez koniecznoลci dodawania wiฤkszej liczby specjalnych zmiennych lub sesji, aby mรณc je uruchomiฤ. Jest to bardzo pomocne w procesie szkoleniowym.
Pytorch implementuje takลผe programowanie imperatywne, ktรณre jest zdecydowanie bardziej elastyczne. Moลผna zatem wydrukowaฤ wartoลฤ tensora w trakcie procesu obliczeniowego.
Wady PyTorcha
PyTorch wymaga aplikacji innych firm do wizualizacji. Potrzebuje takลผe serwera API do produkcji.
W dalszej czฤลci tego samouczka dotyczฤ cego PyTorch dowiemy siฤ o rรณลผnicy miฤdzy PyTorch i TensorFlow.
PyTorch vs. Tensorflow
| Parametr | PyTorch | Tensorflow |
|---|---|---|
| Definicja modelu | Model jest zdefiniowany w podklasie i oferuje ลatwy w uลผyciu pakiet | Model jest zdefiniowany na wiele sposobรณw i musisz zrozumieฤ skลadniฤ |
| Obsลuga GPU | Tak | Tak |
| Typ wykresu | Dynamiczny | Statyczny |
| Narzฤdzia | Brak narzฤdzia do wizualizacji | Moลผesz uลผyฤ narzฤdzia do wizualizacji Tensorboard |
| Spoลecznoลฤ | Spoลecznoลฤ wciฤ ลผ roลnie | Duลผe aktywne spoลecznoลci |
Instalowanie PyTorcha
Linux
Instalacja w systemie Linux jest prosta. Moลผesz wybraฤ ลrodowisko wirtualne lub zainstalowaฤ je bezpoลrednio z uprawnieniami roota. Wpisz to polecenie w terminalu
pip3 install --upgrade torch torchvision
AWS Sagemaker
Sagemaker to jedna z platform w Amazon Serwis internetowy ktรณry oferuje potฤลผny silnik uczenia maszynowego z preinstalowanymi konfiguracjami gลฤbokiego uczenia dla analitykรณw danych i programistรณw w celu tworzenia, trenowania i wdraลผania modeli w dowolnej skali.
Najpierw otwรณrz Amazon Strzelec konsoli i kliknij Utwรณrz instancjฤ notatnika, a nastฤpnie wprowadลบ wszystkie szczegรณลy dotyczฤ ce notatnika.
Nastฤpny krok: Kliknij Otwรณrz, aby uruchomiฤ instancjฤ notatnika.
Wreszcie w Jupyter, Kliknij Nowy i wybierz conda_pytorch_p36 i moลผesz juลผ uลผywaฤ instancji notatnika z zainstalowanym Pytorch.
W dalszej czฤลci tego samouczka dotyczฤ cego PyTorch poznamy podstawy frameworku PyTorch.
Podstawy frameworku PyTorch
Poznajmy podstawowe koncepcje PyTorch, zanim zagลฤbimy siฤ w temat. PyTorch uลผywa Tensora dla kaลผdej zmiennej, podobnie jak ndarray numpy, ale z obsลugฤ obliczeล GPU. Tutaj wyjaลnimy model sieciowy, funkcjฤ straty, Backprop i Optimizer.
Model sieciowy
Sieฤ moลผna zbudowaฤ poprzez podklasฤ torch.nn. Istniejฤ 2 gลรณwne czฤลci,
- Pierwsza czฤลฤ polega na zdefiniowaniu parametrรณw i warstw, ktรณrych bฤdziesz uลผywaฤ
- Druga czฤลฤ to gลรณwne zadanie zwane procesem forward, ktรณre pobiera dane wejลciowe i przewiduje wynik.
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()
Jak widaฤ powyลผej, tworzysz klasฤ nn.Module o nazwie Model. Zawiera 2 warstwy Conv2d i warstwฤ Linear. Pierwsza warstwa conv2d przyjmuje dane wejลciowe o wartoลci 3 i ksztaลt wyjลciowy o wartoลci 20. Druga warstwa przyjmuje dane wejลciowe o wartoลci 20 i generuje ksztaลt wyjลciowy o wartoลci 40. Ostatnia warstwa jest w peลni poลฤ czonฤ warstwฤ w ksztaลcie 320 i generuje wynik 10.
Proces forward pobierze dane wejลciowe X i przekaลผe je do warstwy conv1 i wykona funkcjฤ ReLU,
Podobnie bฤdzie rรณwnieลผ zasilaฤ warstwฤ conv2. Nastฤpnie x zostanie przeksztaลcone w (-1, 320) i wprowadzone do koลcowej warstwy FC. Zanim wyลlesz dane wyjลciowe, skorzystasz z funkcji aktywacji softmax.
Proces wsteczny jest automatycznie definiowany przez autograd, wiฤc wystarczy zdefiniowaฤ proces do przodu.
Funkcja straty
Funkcja straty sลuลผy do pomiaru tego, jak dobrze model predykcyjny jest w stanie przewidzieฤ oczekiwane wyniki. PyTorch ma juลผ wiele standardowych funkcji utraty w module torch.nn. Na przykลad moลผesz uลผyฤ straty krzyลผowej entropii, aby rozwiฤ zaฤ wieloklasowy problem klasyfikacji PyTorch. ลatwo jest zdefiniowaฤ funkcjฤ straty i obliczyฤ straty:
loss_fn = nn.CrossEntropyLoss() #training process loss = loss_fn(out, target)
Za pomocฤ PyTorch ลatwo jest obliczyฤ wลasnฤ funkcjฤ straty.
Podpรณrka
Aby wykonaฤ propagacjฤ wstecznฤ , wystarczy wywoลaฤ funkcjฤ los.backward(). Bลฤ d zostanie obliczony, ale pamiฤtaj, aby wyczyลciฤ istniejฤ cy gradient za pomocฤ funkcji zero_grad()
net.zero_grad() # to clear the existing gradient loss.backward() # to perform backpropragation
Optimizer
Torch.optim zapewnia typowe algorytmy optymalizacji. Moลผesz zdefiniowaฤ optymalizator za pomocฤ prostego kroku:
optimizer = torch.optim.SGD(net.parameters(), lr = 0.01, momentum=0.9)
Musisz przekazaฤ parametry modelu sieci i szybkoลฤ uczenia siฤ, aby przy kaลผdej iteracji parametry byลy aktualizowane po procesie backprop.
Prosta regresja za pomocฤ PyTorch
Nauczmy siฤ prostej regresji na przykลadach PyTorch:
Krok 1) Stworzenie naszego modelu sieci
Nasz model sieci to prosta warstwa liniowa z wejลciem i wyjลciem o ksztaลcie 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)
A wyjลcie sieciowe powinno byฤ takie
Net( (hidden): Linear(in_features=1, out_features=1, bias=True) )
Krok 2) Dane testowe
Zanim rozpoczniesz proces szkolenia, musisz poznaฤ nasze dane. Tworzysz losowฤ funkcjฤ, aby przetestowaฤ nasz model. Y = x3 grzech(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()
Oto wykres rozrzutu naszej funkcji:
Przed rozpoczฤciem procesu uczenia musisz przekonwertowaฤ tablicฤ numpy na zmienne obsลugiwane przez Torch i autograd, jak pokazano w poniลผszym przykลadzie regresji PyTorch.
# 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)
Krok 3) Optymalizator i strata
Nastฤpnie naleลผy zdefiniowaฤ Optymalizator i Funkcjฤ Straty dla naszego procesu uczenia.
# Define Optimizer and Loss Function optimizer = torch.optim.SGD(net.parameters(), lr=0.2) loss_func = torch.nn.MSELoss()
Krok 4) Szkolenie
Teraz rozpocznijmy nasz proces szkoleniowy. W epoce 250 bฤdziesz iterowaฤ nasze dane, aby znaleลบฤ najlepszฤ wartoลฤ naszych hiperparametrรณw.
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()
Krok 5) Wynik
Jak widaฤ poniลผej, pomyลlnie wykonaลeล regresjฤ PyTorch za pomocฤ sieci neuronowej. Wลaลciwie przy kaลผdej iteracji czerwona linia na wykresie bฤdzie aktualizowana i zmienia swoje poลoลผenie, aby dopasowaฤ siฤ do danych. Ale na tym obrazku pokazuje tylko wynik koลcowy, jak pokazano w poniลผszym przykลadzie PyTorch:
Przykลad klasyfikacji obrazu za pomocฤ PyTorch
Jedna z popularnych metod nauki podstaw gลฤboka nauka jest z zestawem danych MNIST. Jest to โHello Worldโ w gลฤbokim uczeniu. Zestaw danych zawiera rฤcznie pisane liczby od 0 do 9 z caลkowitฤ liczbฤ 60,000 10,000 prรณbek szkoleniowych i 28 28 prรณbek testowych, ktรณre sฤ juลผ oznaczone rozmiarem XNUMXรXNUMX pikseli.
Krok 1) Wstฤpnie przetwรณrz dane
W pierwszym kroku tego przykลadu klasyfikacji PyTorch zaลadujesz zbiรณr danych za pomocฤ moduลu torchvision.
Zanim rozpoczniesz proces uczenia, musisz zrozumieฤ dane. Torchvision zaลaduje zbiรณr danych i przeksztaลci obrazy zgodnie z odpowiednimi wymaganiami sieci, takimi jak ksztaลt i normalizacja obrazรณw.
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()
Funkcja transformacji konwertuje obrazy na tensor i normalizuje wartoลฤ. Funkcja torchvision.transforms.MNIST, pobierze zbiรณr danych (jeลli nie jest dostฤpny) do katalogu, w razie potrzeby ustawi zbiรณr danych do uczenia i wykona proces transformacji.
Aby zwizualizowaฤ zbiรณr danych, uลผyj data_iterator, aby uzyskaฤ kolejnฤ partiฤ obrazรณw i etykiet. Do wykreลlenia tych obrazรณw i odpowiedniej etykiety uลผywasz narzฤdzia Matplot. Jak widaฤ poniลผej nasze obrazy i ich etykiety.
Krok 2) Konfiguracja modelu sieci
Teraz w tym przykลadzie PyTorch utworzysz prostฤ sieฤ neuronowฤ do klasyfikacji obrazรณw PyTorch.
Tutaj przedstawiamy inny sposรณb tworzenia modelu sieci w PyTorch. Uลผyjemy nn.Sequential do stworzenia modelu sekwencji zamiast tworzyฤ podklasฤ 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)
Oto wynik naszego modelu sieci
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() )
Wyjaลnienie sieci
- Sekwencja jest taka, ลผe โโpierwsza warstwa to warstwa Conv2D z ksztaลtem wejลciowym 1 i ksztaลtem wyjลciowym 10 z rozmiarem jฤ dra 5
- Nastฤpnie masz warstwฤ MaxPool2D
- Funkcja aktywacji ReLU
- warstwฤ rezygnacji, aby usunฤ ฤ wartoลci o niskim prawdopodobieลstwie.
- Nastฤpnie drugi Conv2d z ksztaลtem wejลciowym 10 z ostatniej warstwy i ksztaลtem wyjลciowym 20 z rozmiarem jฤ dra 5
- Nastฤpnie warstwa MaxPool2d
- Funkcja aktywacji ReLU.
- Nastฤpnie spลaszczysz tensor przed wprowadzeniem go do warstwy Linear
- Warstwa liniowa odwzoruje nasze wyjลcie na drugฤ warstwฤ liniowฤ z funkcjฤ aktywacji softmax
Krok 3) Wytrenuj model
Przed rozpoczฤciem procesu uczenia naleลผy ustawiฤ funkcjฤ kryterium i optymalizatora.
W przypadku kryterium uลผyjesz CrossEntropyLoss. W przypadku Optimizera uลผyjesz SGD ze wspรณลczynnikiem uczenia 0.001 i momentem 0.9, jak pokazano w poniลผszym przykลadzie PyTorch.
import torch.optim as optim criterion = nn.CrossEntropyLoss() optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)
Proces forward przyjmie ksztaลt wejลciowy i przekaลผe go do pierwszej warstwy conv2d. Nastฤpnie zostanie on wprowadzony do maxpool2d i ostatecznie wprowadzony do funkcji aktywacji ReLU. Ten sam proces bฤdzie miaล miejsce w drugiej warstwie conv2d. Nastฤpnie dane wejลciowe zostanฤ przeksztaลcone w (-1,320) i wprowadzone do warstwy fc w celu przewidzenia wyniku.
Teraz rozpoczniesz proces szkolenia. Bฤdziesz iterowaฤ po naszym zestawie danych 2 razy lub z epokฤ 2 i drukowaฤ bieลผฤ cฤ stratฤ w kaลผdej partii 2000.
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
W kaลผdej epoce moduล wyliczajฤ cy otrzyma nastฤpnฤ krotkฤ danych wejลciowych i odpowiadajฤ ce im etykiety. Zanim wprowadzimy dane wejลciowe do naszego modelu sieci, musimy wyczyลciฤ poprzedni gradient. Jest to wymagane, poniewaลผ po procesie wstecznym (procesie propagacji wstecznej) gradient zostanie kumulowany, a nie zastฤpowany. Nastฤpnie obliczymy straty na podstawie przewidywanej produkcji na podstawie oczekiwanej produkcji. Nastฤpnie wykonamy propagacjฤ wstecznฤ , aby obliczyฤ gradient, a na koniec zaktualizujemy parametry.
Oto wynik procesu szkoleniowego
[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
Krok 4) Przetestuj model
Po wytrenowaniu naszego modelu naleลผy przetestowaฤ lub oceniฤ go z innymi zestawami obrazรณw.
Uลผyjemy iteratora dla test_loader, ktรณry wygeneruje partiฤ obrazรณw i etykiet, ktรณre zostanฤ przekazane do wytrenowanego modelu. Przewidywany wynik zostanie wyลwietlony i porรณwnany z oczekiwanym wynikiem.
#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()
Podsumowanie
- PyTorch jest oparty na otwartym kodzie ลบrรณdลowym Torch Nauczanie maszynowe biblioteka dla przetwarzanie jฤzyka naturalnego za pomocฤ Python.
- Zalety PyTorch: 1) Prosta biblioteka, 2) Dynamiczny wykres obliczeniowy, 3) Lepsza wydajnoลฤ, 4) Natywny Python
- PyTorch uลผywa Tensora dla kaลผdej zmiennej podobnej do ndarray numpy, ale z obsลugฤ obliczeล GPU.
- Jednฤ z popularnych metod poznania podstaw gลฤbokiego uczenia siฤ jest wykorzystanie zbioru danych MNIST.










