pytorch

Tutorial Dasar PyTorch : Tensor dan Autograd

Saya mulai menggunakan PyTorch semenjak mengerjakan Tesis di tahun 2017 akhir. PyTorch merupakan pengembangan dari Torch Framework yang dikembangkan oleh Facebook dan difokuskan sebagai framework berbahasa Python untuk proses komputasi Machine Learning, sehingga bisa disandingkan dengan framework sejenis seperti Tensorflow (dikembangkan oleh Google), Keras, Theano (sudah tidak dikembangkan), Caffe2, dan lainnya.

Menurut saya salah satu keunggulan PyTorch dibanding framework lain adalah sintaks yang digunakan tidak terlalu beda dengan fungsi-fungsi pada Numpy, bahkan rasanya dia memiliki sintaks yang lebih rapi dan sederhana

Untuk memulai belajar PyTorch, menurut saya ada dua komponen utama yang perlu dipahami terlebih dahulu, yakni Tensor dan Autograd.

PyTorch Tensor

Tensor adalah sebuah tipe data atau class yang merepresentasikan sebuah array, atau tepatnya ndimensional array karena tidak terbatas pada dimensi-dimensi tertentu. Pada contoh di bawah adalah tensor dengan dimensi 1 bernilai [1,2,3]

import torch
t = torch.tensor([1,2,3])
print(t)

Sebuah tensor pada PyTorch dapat dibuat dengan tiga cara:

  1. Diberi langsung nilai arraynya
  2. Generate dengan fungsi bawaan (misalnya random)
  3. Diconvert dari Numpy array
t = torch.tensor([1,2,3]) # cara 1
print(t)
t = torch.rand(3,4) # cara 2
print(t)
x = numpy.array([[2.5, 3.2],[1.0,1.9]]) # cara 3
t = torch.from_numpy(x)
print(t)

Class Tensor dapat dikenali dari tipenya. Jika digunakan fungsi bawaan Python `type(x)` maka akan diberitahu bahwa x adalah class tensor dari PyTorch. Namun, itu hanya sebatas menginfokan bahwa x adalah tensor, tetapi tidak menampilkan tipe dari elemen yang terkandung di dalamnya. Untuk menampilkan tipe data dari elemennya gunakan `.type()` bawaan dari PyTorch:

Untuk mengubah tipe, gunakan parameter `dtype`

t = torch.tensor([1,2,3], dtype=torch.float32)
print(t.type())
# output : torch.FloatTensor

Class Tensor yang merupakan bawaan PyTorch tentu masih terbatas dan tidak bisa disamakan dengan Numpy array atau Python list. Untuk itu jika terdapat fungsi yang belum ada pada PyTorch yang kita butuhkan, proses konversi bisa dilakukan (fungsi tambahan `clone()` diperlukan untuk menghindari pass by reference).

t = torch.tensor([1,2,3], dtype=torch.float32)

n = t.clone().numpy()   # dari tensor ke numpy
print(type(n))

new_t = torch.tensor(n).clone() # dari numpy ke tensor
print(type(new_t))

Tensor Operation

Operasi yang dapat dilakukan pada Numpy hampir semua sudah bisa dilakukan di Tensor, meskipun beberapa memiliki penulisan sintaks yang berbeda. Berikut beberapa operasi sederhana pada tensor

t = torch.tensor([[1,2,3],[4,5,6],[7,8,9]])
print(t)

# variasi operasi dasar: penjumlahan
t += 1
print(t)
t.add_(2)
print(t)
new_t = t + 2
print(new_t)
new_t = torch.add(t,2)
print(new_t)

# slicing
print(t[0,1:]) # baris pertama, kolom kedua sampai habis
print(t[:,[1,2]]) # semua baris, kolom index 1 dan 2
print(t[[0,2],1:]) # baris index 0 dan 2, kolom kedua sampai habis

# dua tensor
s = torch.tensor([[1,2],[3,4],[5,6]])
print(torch.mm(t,s)) # perkalian dua matriks
s = torch.ones((3,3), dtype=torch.long)
print(s + t) # penjumlahan dua matriks

# fungsi lain-lain
print(t.view(9)) # resize dari 3x3 menjadi 1x9 (satu dimensi)
print(t.view(3,1,3)) # resize menjadi 3x1x3 (tiga dimensi)
print(t.sum()) # menjumlahkan semua elemennya
print(t.sum(dim=0)) # menjumlahkan per kolom

Terdapat lebih dari 100 operasi yang bisa dilakukan Tensor, untuk info lebih lengkap silakan kujungi halaman dokumentasi resmi Tensor: https://pytorch.org/docs/stable/tensors.html

Autograd

Autograd adalah sebuah package yang memudahkan dalam melakukan perhitungan turunan (diferensial). Turunan adalah bagian penting pada Machine Learning khususnya Neural Network, contohnya untuk Backpropagation (contoh perhitungan backpropagation bisa dilihat di artikel ini).

Tensor memiliki sebuah attribut `.requires_grad` yang secara default bernilai `False`. Jika `.requires_grad` diberi nilai `True` maka operasi-operasi yang terjadi pada tensor tersebut akan dicatat, sehingga memungkinkan untuk dilakukan operasi turunan yang berantai.

t = torch.tensor([1,2,3], dtype=torch.float32)
print(t.requires_grad)
# output : False

Berikut ini kita coba gunakan autograd untuk menghitung turunan. Misalnya kita punya persamaan berikut:

$$ z = 2x^2 + y^3 $$

Sehingga misal nilai x awalnya adalah 2 dan y adalah 3, maka dapat kita hitung turunan untuk masing-masing variabel adalah:

$$ \frac{dz}{dx} = 4x + 0 = 4(2) = 8$$

$$ \frac{dz}{dy} = 0 + 3y^2 = 3(3)^2 = 27 $$

jika proses ini dilakukan menggunakan kode:

x = torch.tensor(2, dtype=torch.float32, requires_grad=True)
y = torch.tensor(3, dtype=torch.float32, requires_grad=True)
z = 2*x**2 + y**3
z.backward()   # proses diferensial/autograd
print(x.grad)  # hasil dz/dx = 8
print(y.grad)  # hasil dz/dy = 27

Sekian tutorial singkat PyTorch Tensor dan Autograd, semoga bermanfaat 🙂

sumber gambar: flickr

About the author

Rian Adam

Lecturer at Universitas Islam Indonesia; Machine Learning Enthusiast

View all posts

Leave a Reply