Pengenalan Neural Networks

Tulisan ini adalah catatan belajar PyTorch Udacity Scholar nd188. Sebagian gambar milik kelas tersebut.

Instalasi paket torch dan torchvision, sesuaikan dengan paket manager yang digunakan 1, misalnya pip atau conda.

Misalnya menggunakan pip, di linux ini akan mendownload paket torch sekitar 750MB:

pip install torch torchvision

Untuk mengecek apakah paketnya sudah terinstal dengan baik.

from __future__ import print_function
import torch
x = torch.rand(5, 3)
print(x)

Untuk yang menggunakan GPU CUDA, bisa mengecek dengan cara berikut.

import torch
torch.cuda.is_available()

Kita akan menggunakan kode yang sudah tersedia di github repo udacity 2, di dalamnya ada direktori intro-to-pytorch.

Untuk menggunakan jupyter notebook (iPython Notebook), kita butuh install paket jupyter dan notebook. Atau bisa juga menggunakan google colab, tapi butuh memindahkan file atau copy-paste ke google colab.

pip install jupyter notebook

Dengan jupyter dan notebook yang sudah teristall, prosesnya cukup run command berikut di direktori hasil clone repo udacity:

jupyter notebook

Ini adalah kode training pertama yang diambil dari notebook Part 3 - Training Neural Networks (Exercises).

device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
# Assuming that we are on a CUDA machine, this should print a CUDA device:
print(device)

model = nn.Sequential(nn.Linear(784, 128),
                      nn.ReLU(),
                      nn.Linear(128, 64),
                      nn.ReLU(),
                      nn.Linear(64, 10),
                      nn.LogSoftmax(dim=1)).to(device)

criterion = nn.NLLLoss()
optimizer = optim.SGD(model.parameters(), lr=0.003)

epochs = 5
for e in range(epochs):
    running_loss = 0
    for images, labels in trainloader:
        images, labels = images.to(device), labels.to(device)

        # Flatten MNIST images into a 784 long vector
        images = images.view(images.shape[0], -1)
    
        # Clear the gradients, do this because gradients are accumulated
        optimizer.zero_grad()

        # Forward pass, then backward pass, then update weights
        output = model(images)
        loss = criterion(output, labels)
        loss.backward()
        
        # Take an update step and few the new weights
        optimizer.step()
        
        running_loss += loss.item()
    else:
        print(f"Training loss: {running_loss/len(trainloader)}")

Untuk device = 'cpu' penggunaan prosesornya hampir selalu penuh (100%) selama periode training.

Training Neural Network dengan CPU

Saat dipindahkan ke GPU dengan device = 'cuda:0' penggunaan prosesornya hanya sesekali penuh saat periode training.

Training Neural Network dengan CUDA GPU

TBD