Vijesti o Tehnologiji, Recenzije i Savjeti!

Vodič za izradu end-to-end modela dubokog učenja u PyTorchu

Napomena: Sljedeći članak će vam pomoći: Vodič za izradu end-to-end modela dubokog učenja u PyTorchu

PyTorch je vrlo moćan okvir za izgradnju dubokog učenja. Ovaj okvir nije tako složen za učenje u usporedbi s drugim okvirima dubokog učenja zbog jednostavnog načina izgradnje modela. U ovom ćemo članku raspravljati o tome kako izgraditi model dubokog učenja od kraja do kraja koji može biti od pomoći praktičaru strojnog učenja početniku. Kroz ovaj vodič, pokazat ćemo kako definirati i koristiti konvolucionarnu neuronsku mrežu (CNN) na vrlo jednostavan način objašnjavajući svaki od koraka u detalje. Glavne točke koje treba obraditi u ovom članku navedene su u nastavku.

Sadržaj

    Konvolucijska neuronska mreža (CNN) Implementacija CNN-a pomoću Pytorcha

      Priprema skupa podataka Izrada modela Smjernice kojih se treba pridržavati tijekom izgradnje modela Sastavljanje modela Obuka, testiranje i postupak evaluacije

Prvo raspravimo o CNN-u i pokušajmo razumjeti kako bi se to trebalo implementirati.

Konvolucijska neuronska mreža (CNN)

CNN-ovi su modeli dubokih neuronskih mreža koji su izvorno dizajnirani za analizu ulaza 2D slike, ali sada mogu analizirati i 1D i 3D podatke. Jezgra konvolucijske neuronske mreže može biti sastavljena od dva ili više konvolucijskih slojeva, od kojih svaki izvodi “konvoluciju”, što uključuje množenje ulaza neuronske mreže nizom od nxn dijagonalnih matrica.

Ovo se umnožavanje postiže, za razliku od tradicionalne neuronske mreže, korištenjem “prozora” koji prelazi sliku, poznatog kao filtar ili kernel. Svaki put kad filtar prijeđe preko slike, težine se množe s nizom ulaznih vrijednosti. Izlazne vrijednosti operacije konvolucije za svaku poziciju filtra (jedna vrijednost za svaku poziciju filtra) čine dvodimenzionalnu matricu izlaznih vrijednosti koje predstavljaju značajke izvučene iz temeljne slike. “Mapa značajki” je naziv dat ovoj izlaznoj matrici.

Nakon što je karta značajki dovršena, bilo koja vrijednost u funkcionalnoj mapi može se nelinearno prenijeti na sljedeći konvolucijski sloj (na primjer, putem ReLU aktivacije). Potpuno povezani slojevi primaju izlaz niza konvolucijskih slojeva i generiraju konačno predviđanje, koje je obično oznaka koja opisuje sliku.

Ukratko, kompletan CNN model sastoji se od dva sloja, uglavnom konvolucionog sloja i drugog sloja koji se sastoji od skupnog sloja. Konvolucijski sloj stvara mapu značajki upotrebom matematičkih operacija kao što je gore objašnjeno, a sloj udruživanja dodatno se koristi za smanjenje veličine mape značajki. Najčešći slojevi udruživanja su maksimalni i prosječni udruživanje, koji uzimaju maksimalnu i prosječnu vrijednost iz veličine filtera (tj. 2×2, 3×3i tako dalje).

Sada ćemo vidjeti kako možemo implementirati takav CNN model koristeći PyTorch.

Implementacija CNN-a pomoću Pytorcha

PyTorch je jedna od najpoznatijih i najčešće korištenih knjižnica za duboko učenje, osobito u akademskim istraživanjima. To je okvir za strojno učenje otvorenog koda koji skraćuje vrijeme potrebno za prijelaz od izrade prototipa za istraživanje do implementacije u proizvodnju. Ova će implementacija biti podijeljena u glavne korake kao što su učitavanje podataka, izgradnja modela, obuka modela i testiranje modela.

U ovom odjeljku provest ćemo vas kroz postupak korak po korak

Sada će brzo uvesti sve ovisnosti koje su potrebne.

import torch import torch.nn as nn import torchvision import torch.nn.functional as F import torchvision.transforms as transforms import matplotlib.pyplot as plt

Priprema skupa podataka

Kao što smo spomenuli, prvo ćemo učitati skup podataka. Skup podataka koji ovdje koristimo je EMNIST koji je proširena verzija skupa podataka MNIST koji sadrži rukom pisane znamenke zajedno s malim i velikim rukom pisanim slovima. Podskup za obuku ovog skupa podataka sadrži gotovo 1,20 000 slika veličine 28 x 28 piksela i one su u sivim tonovima. Ovaj skup podataka možemo učitati kao obuku i testiranje navođenjem u samom API-ju.

U nastavku smo prvo definirali funkcionalnost predobrade slika i one koje treba primijeniti u skupu podataka za obuku i testiranje prilikom preuzimanja. Kasnije smo upotrijebili program za učitavanje podataka koji je koristan posebno u ovim slučajevima kada imamo tisuće slika i učitavanje svih njih u isto vrijeme će naš sustav držati pod ogromnim teretom. Učitavač podataka čini ovaj skup podataka iterativnim i učinkovitim pozivanjem.

# primijeni transformaciju transform = transforms.Compose([transforms.ToTensor(),
transforms.Normalize((0.5,), (0.5,))
]) # preuzimanje podataka training_data = torchvision.datasets.EMNIST(root=”contents/”,download=True, transform=transform, train=True,split=”balanced”) test_data = torchvision.datasets.EMNIST(root=”contents /”,download=True, transform=transform, train=False,split=”balanced”) # izgraditi učitavač podataka train_loader = torch.utils.data.DataLoader(dataset = training_data, batch_size = 128, shuffle = True) test_loader = torch.utils.data.DataLoader(dataset = test_data, batch_size = 128, shuffle = True)

Ovdje su neki od uzoraka našeg skupa podataka.

Izgradnja modela

Sljedeći korak je definiranje modela. Ovdje ćemo definirati naš model kao što definiramo neku sofisticiranu klasu u pythonu. Možemo započeti stvaranjem nove klase koja koristi PyTorch nn.Modul razreda. Ovo je bitno pri izgradnji neuronske mreže jer nam pruža mnoštvo korisnih metoda.

Zatim se moraju definirati slojevi naše neuronske mreže. Ovo se radi u razredu __u tome__ metoda. Možemo jednostavno imenovati naše slojeve i dodijeliti ih odgovarajućem sloju, kao što je za ovaj slučaj konvolucijski sloj, sloj za udruživanje, potpuno povezani sloj itd.

Konačno, u našem razredu moramo definirati a naprijed metoda. Cilj ove metode je odrediti redoslijed kojim se ulazni podaci obrađuju na različitim slojevima. Kombinirano sve gore navedeno možemo kodirati kao,

klasa CNNModel(nn.Module): def __init__(self): super(CNNModel, self).__init__() self.conv1 = nn.Conv2d(in_channels=1out_channels=32, kernel_size= 5,korak = 1) self.conv2 = nn.Conv2d(32, 64, 5, 1) self.fc = nn.Linear(64*20*20, 47) def forward(self, x): x = F.relu(self.conv1(x)) x = F.relu(self.conv2(x) ) x = F.max_pool2d(x, 1) x = torch.flatten(x, 1) x = self.fc(x) output = F.log_softmax(x, dim=1) povratni izlaz # pokretanje modela modela = CNNModel()

Smjernice kojih se treba pridržavati prilikom izrade modela

Kada pogledate distribuciju slojeva i veličine jedinica ispod sloja, mogli biste pomisliti da možemo proizvoljno dobro proći, ali to nije slučaj. Iako sam i ja pokušao pristupiti na taj proizvoljan način na kraju sam dobio grešku za dimenzionalni miss-match.

Ova pogreška uglavnom nastaje između veze našeg konvolucijskog sloja i linearnog sloja. U PyTorchu svaki sloj uzima niz obaveznih argumenata u našem slučaju kao što je prikazano za konvolucijski sloj:ulazni_kanali, izlazni_kanali, jezgre, i izborno a iskorak.

Ne možemo postavljati ulazne kanale proizvoljno, već na temelju vrste naše slike je li u sivim tonovima / ili crno-bijela jer bi trebala biti 1 inače bi za RGB sliku trebalo biti 3. Veličinu izlaza možemo postaviti na bilo koji broj i trebali bismo to učiniti jednakim unosu sljedećeg uzastopnog sloja. Kerneli nisu ništa drugo nego filtar koji se koristi za stvaranje mape značajki za danu sliku, a korak u osnovi govori o kretanju kernela preko slike ovdje 1 označava uzimanje 1 korak po korak.

Dakle, od gornjeg linearnog sloja očekujte dvije bitne dimenzije, tj. ulazni i izlazni oblik. Kada konvolucijski sloj povežemo s linearnim slojem, on u biti prihvaća veličinu naše slike. A posljednji konvolucijski sloj na koji je promijenjena dimenzija naših slika sada više nije 28 x 28 piksela.

Da bi se dobila odgovarajuća vrijednost ulaznih kanala linearnog sloja, izračun se može napraviti na sljedeći način,

    Za prvi sloj smo isporučili sliku 28 x 28 nakon nanošenja 5 x 5 veličine konvolucijskih piksela smanjene su za 4 sa svake strane čineći 24 x 24 na izlazu 1. sloja. Nadalje, na sljedećem sloju imamo isti filtar od 5 x 5 to će ga učiniti daljnjih 20 x 20 i to je veličina serije pojedinačne slike na izlaznom 2. sloju.

Kao što smo već spomenuli, ulazni kanali za linearni sloj trebali bi biti 64*20*20. Ako želite povećati slojeve, slijedite operaciju jezgre i dobijete odgovarajuću veličinu serije za potpuno povezane slojeve.

Dođimo sada do definicije modela, u metodi naprijed smo primijenili funkciju aktivacije na svaki sloj nakon toga smo primijenili operaciju udruživanja gdje smo koristili max-pooling, i nakon što smo spljoštili slojeve. I na kraju, u prolazu naprijed, primijenili smo funkciju softmax koja će se pokazati kao klasifikator.

Sastavljanje modela

Sada ćemo u sljedećem sastaviti naš model, ovdje uglavnom definiramo funkciju gubitka i funkciju optimizacije. Ovdje se unakrsna entropija koristi kao funkcija gubitka, a Stohastički gradijentni optimizator spuštanja koristi se za smanjenje gubitka u procesu obuke.

# kriterij funkcije gubitka = nn.CrossEntropyLoss() # Optimizator optimizacije = torch.optim.SGD(model.parameters(), lr=00,001)

Postupak obuke, testiranja i ocjenjivanja

Zatim smo izgradili sve postupke i izračune. Sada je vrijeme za treniranje gornjeg modela. Obuka u PyTorchu je ovdje malo nezgodna. Svakom elementu moramo pristupiti ručno i moramo ga rasporediti u petlju kako bismo omogućili kontinuiranu obuku. Postupak je sljedeći.

Počinjemo ponavljanjem broja epoha u našim podacima o obuci, nakon čega slijede serije. Pretvaramo slike i oznake na temelju uređaja koji koristimo, bilo da je to GPU ili CPU. U prosljeđivanju koristimo naš model za izradu predviđanja i zatim izračunavanje gubitka na temelju tih predviđanja i naših stvarnih oznaka.

Nakon toga izvodimo prolaz unatrag u kojem ažuriramo svoje težine kako bismo poboljšali svoj model. Gradijenti se zatim postavljaju na nulu prije svakog ažuriranja pomoću optimizator.zero grad() funkcija. Novi gradijenti se tada izračunavaju pomoću gubitak.natrag() funkcija.

Na kraju koristimo optimizator.step() funkcija za ažuriranje utega.

# dohvaćanje modela u radni uređaj model.to(device) # gubitak treninga train_loss = []
test_gubici =[]
def train(e): #Učitaj podatke za i, (slike, oznake) u enumerate(train_loader): # učitaj podatke na uređaj images = images.to(device) labels = labels.to(device) # Proslijedi izlazi = model(slike) gubitak = kriterij(izlazi, oznake) # Unatrag i optimiziraj optimizer.zero_grad() loss.backward() optimizer.step() train_loss.append(loss.item()) print(‘Epoha [{}/{}]Gubitak vlaka: {:.4f}’.format(e+110, gubitak.stavka()))

Slično tome, tehnika testiranja ne razlikuje se od postupka treninga, s izuzetkom izračuna gradijenata jer ne ažuriramo nikakve težine. Šifru prilažemo uz baklja.no grad() jer nema potrebe izračunavati gradijente. Zatim koristimo naš model da predvidimo svaku seriju i izračunamo koliko ih je točnih.

def test(): test_loss = 0
s bakljom.no_grad(): correct = 0
ukupno = 0
za slike, oznake u test_loaderu: images = images.to(device) labels = labels.to(device) outputs = model(images) test_loss += F.nll_loss(outputs, labels, size_average=False).item() _, predviđeno = torch.max(outputs.data, 1) ukupno += labels.size(0) ispravno += (predviđeno == oznake).sum().item() test_loss /= len(test_loader.dataset) test_losses.append(test_loss) print(‘Točnost testa: {:4f} %, Test gubitak: {: 4f}’.format((100 * točno / ukupno),test_loss))

Obuku i testiranje možemo pokrenuti istovremeno koristeći dvije gore definirane funkcije.

za i u rasponu (10): vlak(i) test()

Vodič za izradu end-to-end modela dubokog učenja u PyTorchu 1

To rezultira točnošću testiranja od oko 79%. Za više detalja pogledajte bilježnicu.

Završne riječi

Kroz ovaj članak raspravljali smo o konvolucijskoj neuronskoj mreži i praktično smo je implementirali pomoću PyTorcha. Ako to usporedimo s drugim okvirima, PyTorch je napravljen da bude više usmjeren na programere. Za korištenje PyTorcha potrebno je jasno razumijevanje aplikacije. U ovom slučaju, razvili smo CNN tako da bismo trebali moći pratiti konvolucijske operacije kroz slojeve. Na kraju, rekao bih da kao početnik trebamo koristiti PyTorch. Pomoći će vam da izoštrite svoje koncepte dok gradite sam model.

Reference