PyTorch është një bibliotekë e njohur për mësimin e makinerive me burim të hapur për Python që ofron një ndërfaqe të nivelit të lartë për të punuar me grafikë dinamikë llogaritës. Ai u zhvillua kryesisht nga grupi kërkimor i inteligjencës artificiale të Facebook. Sot, PyTorch është një nga bibliotekat më të njohura për ndërtimin e kornizave të të mësuarit të thellë. Të mësuarit e thellë lehtëson të mësuarit e paraqitjeve të ndërlikuara të veçorive në imazhe, duke e bërë atë një teknikë ideale për klasifikim. Këtu mund të mësoni se si të ndërtoni dhe trajnoni një rrjet të thjeshtë klasifikimi të mësimit të thellë nga fundi në fund.

Së pari, le të fillojmë me shkarkimin e të dhënave të MNIST dhe krijimin e ngarkuesve të të dhënave të trenave dhe testeve. Të dhënat përfshijnë 60,000 trena dhe 10,000 shembuj testimi të shifrave të shkruara me dorë në shkallë gri 0–9 me etiketa:

import torch
import torchvision
import torch.nn as nn

train_loader = torch.utils.data.DataLoader(torchvision.datasets.MNIST('./data', train=True, download=True,
                             transform=torchvision.transforms.Compose([torchvision.transforms.ToTensor(),
                                           torchvision.transforms.Normalize((0.1307,), (0.3081,))])),
                                           batch_size=100, shuffle=True)

test_loader = torch.utils.data.DataLoader(torchvision.datasets.MNIST('./data', train=False, download=True,
                             transform=torchvision.transforms.Compose([torchvision.transforms.ToTensor(),
                                          torchvision.transforms.Normalize((0.1307,), (0.3081,))])),
                                          batch_size=100, shuffle=False)

Krijoni një rrjet të thjeshtë nervor konvolucionar (CNN) me dy shtresa konvolucionare të ndjekura nga dy shtresa plotësisht të lidhura:

# Create the model
class CNN(nn.Module):
    def __init__(self):
        super(CNN, self).__init__()
        self.conv1 = nn.Conv2d(1, 20, 5, 1)
        self.conv2 = nn.Conv2d(20, 50, 5, 1)
        self.fc1 = nn.Linear(4*4*50, 500)
        self.fc2 = nn.Linear(500, 10)

    def forward(self, x):
        x = nn.functional.relu(self.conv1(x))
        x = nn.functional.max_pool2d(x, 2, 2)
        x = nn.functional.relu(self.conv2(x))
        x = nn.functional.max_pool2d(x, 2, 2).view(-1, 4*4*50) # reshape dimensions
        x = nn.functional.relu(self.fc1(x))
        x = self.fc2(x)
        return x
    
model= CNN()

Përcaktoni kriterin e humbjes së entropisë dhe optimizuesin:

criterion = nn.CrossEntropyLoss()
optimizer  = torch.optim.SGD(model.parameters(), lr=0.01, momentum=0.9)

Më në fund, ne mund ta trajnojmë modelin duke përdorur një cikli standard PyTorch:

# Train the model for 5 epochs
for epoch in range(5):
    running_loss = 0.0
    for i, (inputs, labels) in enumerate(train_loader):
        optimizer.zero_grad()
        outputs = model(inputs)
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()
        running_loss += loss.item()
    print(f'[{epoch + 1}/5] loss: {running_loss / (i + 1)}')

Këtu është rezultati pas stërvitjes:

[1/5] loss: 0.2155205728672445
[2/5] loss: 0.05213625013556642
[3/5] loss: 0.035712676378704296
[4/5] loss: 0.026712203502247577
[5/5] loss: 0.02115860335577357

Shkëlqyeshëm, tani kemi ndërtuar dhe trajnuar një CNN për klasifikimin e shifrave të shkruara me dorë në vetëm 30 rreshta kodi!

(opsionale) Le të vlerësojmë tani modelin tonë në grupin e testimit:

with torch.no_grad():
    for i, (inputs, labels) in enumerate(test_loader):
        outputs = model(inputs)
        _, predicted = torch.max(outputs.data, 1)
        correct = (predicted == labels).sum().item()
        print(f'Batch [{i+1}/{len(test_loader)}] accuracy: {correct / len(labels)}')

Këtu është rezultati për 10 grupet e para testuese:

Batch [1/100] accuracy: 0.99
Batch [2/100] accuracy: 1.0
Batch [3/100] accuracy: 0.99
Batch [4/100] accuracy: 1.0
Batch [5/100] accuracy: 1.0
Batch [6/100] accuracy: 0.99
Batch [7/100] accuracy: 0.99
Batch [8/100] accuracy: 0.97
Batch [9/100] accuracy: 1.0
Batch [10/100] accuracy: 0.99

Performanca tashmë duket vërtet e mirë, por ka disa mënyra përmes të cilave ky model mund të përmirësohet për detyra më komplekse klasifikimi. Këtu janë tre shembuj:

  • Bëni CNN më të thellë me më shumë parametra të trajnueshëm
  • Përdorni ndalimin e hershëm në ciklin e trajnimit duke përdorur një grup vërtetimi për të shmangur mbipërshtatjen
  • Vizualizoni hartat e aktivizimit për të identifikuar fokusin e CNN kur klasifikoni etiketat

Nëse ju duket i dobishëm ky tutorial ose dëshironi të kontaktoni, mos ngurroni të kontaktoni me mua këtu, Github ose Linkedin. Gëzuar kodimin!