Idenya
PyTorch adalah library paling populer untuk deep learning: neural network di balik pengenalan gambar, penerjemahan, dan asisten chat. Struktur data intinya adalah tensor: array angka n-dimensi, persis seperti array NumPy, dengan dua kekuatan super:
- ia bisa berada di GPU, tempat perhitungan atas jutaan angka berjalan jauh lebih cepat;
- ia bisa mengingat bagaimana ia dihitung, sehingga PyTorch bisa menghitung gradient secara otomatis (autograd, modul 4).
Semua yang kamu pelajari di track NumPy berlaku hampir satu banding satu.
Cara kerja track ini: PyTorch terlalu besar untuk dijalankan di browser-mu, jadi kode PyTorch di materi ini ditampilkan beserta output aslinya (sudah dicek dengan instalasi PyTorch sungguhan) tetapi tidak punya tombol Try it. Kamu melatih ide yang sama di NumPy, yang bisa berjalan di sini, dan API-nya sendiri lewat kuis. Untuk menjalankan kode PyTorch sendiri: uv add torch, lalu uv run python.
Membuat tensor
Kalau kamu sudah kenal array NumPy, kamu sudah tahu sebagian besar tentang tensor: kisi berisi angka dengan satu tipe, yang punya shape. Cara paling sederhana membuatnya adalah dari list Python:
import torch
daily_orders = torch.tensor([42, 38, 51, 47, 60, 75, 68])
prices = torch.tensor([185.0, 320.0, 95.0])
print(daily_orders)
print(prices)
tensor([42, 38, 51, 47, 60, 75, 68])
tensor([185., 320., 95.])
Padanannya di NumPy, yang bisa kamu jalankan:
import numpy as np
daily_orders = np.array([42, 38, 51, 47, 60, 75, 68])
prices = np.array([185.0, 320.0, 95.0])
print(daily_orders)
print(prices)
[42 38 51 47 60 75 68]
[185. 320. 95.]
Fungsi-fungsi pembuatan yang sudah kamu kenal semuanya tersedia:
print(torch.zeros(2, 3))
print(torch.ones(3))
print(torch.arange(0, 10, 2))
print(torch.linspace(0, 1, 5))
print(torch.full((2, 2), 7.0))
tensor([[0., 0., 0.],
[0., 0., 0.]])
tensor([1., 1., 1.])
tensor([0, 2, 4, 6, 8])
tensor([0.0000, 0.2500, 0.5000, 0.7500, 1.0000])
tensor([[7., 7.],
[7., 7.]])
Satu perbedaan kecil dari NumPy: PyTorch menerima shape sebagai argumen terpisah (torch.zeros(2, 3)) atau tuple (torch.zeros((2, 3))); keduanya berfungsi.
Tensor acak dan seed
Neural network dimulai dari bobot acak, jadi tensor acak ada di mana-mana. Atur seed supaya hasilnya bisa direproduksi:
torch.manual_seed(42)
print(torch.rand(2, 3)) # uniform in [0, 1)
print(torch.randn(3)) # standard normal: mean 0, std 1
tensor([[0.8823, 0.9150, 0.3829],
[0.9593, 0.3904, 0.6009]])
tensor([ 1.1561, 0.3965, -2.4661])
torch.manual_seed(42) berperan seperti np.random.default_rng(42). Angkanya berbeda di antara kedua library, tetapi idenya identik: seed yang sama, angka yang sama, setiap kali dijalankan.
Shape, dtype, size
Saat model PyTorch protes, error-nya hampir selalu tentang shape atau tipe, jadi mengeceknya adalah kebiasaan pertama yang perlu dibangun. Attribute-attribute ini memberi tahu apa yang sedang kamu pegang:
units = torch.tensor([[120, 135, 150], [80, 85, 90]])
print(units.shape)
print(units.ndim, units.numel())
print(units.dtype)
print(torch.tensor([1.5, 2.0]).dtype)
torch.Size([2, 3])
2 6
torch.int64
torch.float32
.shapeadalahtorch.Size, yang berperilaku seperti tuple. (units.size()mengembalikan hal yang sama.).numel()adalah jumlah elemen, padanan.sizedi NumPy.- Bilangan bulat secara default bertipe
int64. - Bilangan desimal secara default bertipe
float32, bukanfloat64seperti di NumPy. Deep learning memakai float 32-bit hampir di mana-mana: memori separuhnya, jauh lebih cepat di GPU, dan cukup presisi untuk proses belajar.
Tensor adalah array ala NumPy dengan shape dan dtype. Model mengharapkan input float32. Mencampur dtype (tensor int64 dimasukkan ke layer dengan bobot float32) adalah salah satu error pemula yang paling umum.
Konversi dengan .float(), .long() atau .to(torch.float32):
counts = torch.tensor([3, 1, 4])
print(counts.float(), counts.float().dtype)
tensor([3., 1., 4.]) torch.float32
Indexing dan nilai tunggal
Indexing dan slicing bekerja persis seperti NumPy:
print(units[0]) # first row
print(units[:, 1]) # second column
print(units[1, 2]) # one element, still a tensor
print(units[1, 2].item()) # a plain Python number
tensor([120, 135, 150])
tensor([135, 85])
tensor(90)
90
.item() mengubah tensor satu elemen menjadi angka Python: kamu akan terus memanggilnya untuk mencetak atau mencatat nilai loss.
Mengubah shape
Model itu rewel soal shape. Sebuah layer mungkin mengharapkan batch berisi contoh dengan shape (batch, features) padahal kamu hanya punya satu contoh dengan shape (features,). Reshaping menyusun ulang angka yang sama ke dalam shape yang kamu butuhkan:
monthly = torch.arange(12)
print(monthly.reshape(4, 3))
print(monthly.reshape(-1, 6).shape)
print(monthly.unsqueeze(0).shape, monthly.unsqueeze(1).shape)
tensor([[ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8],
[ 9, 10, 11]])
torch.Size([2, 6])
torch.Size([1, 12]) torch.Size([12, 1])
reshape dan -1 bekerja seperti di NumPy. unsqueeze(dim) menyisipkan dimensi berukuran 1, nama PyTorch untuk np.newaxis / np.expand_dims; squeeze() membuang dimensi berukuran 1. Menambahkan dimensi "batch" dengan unsqueeze(0) sebelum memasukkan satu contoh ke model adalah rutinitas harian.
Mengapa ini penting untuk kode yang bersih
Shape dan dtype adalah kontrak antara data dan model-mu. Kebiasaan dari track NumPy (cetak .shape dan .dtype saat ragu, dokumentasikan arti setiap dimensi, konversi secara eksplisit) bahkan lebih penting di sini, karena kesalahan shape di dalam network sering menghasilkan error membingungkan yang muncul sepuluh layer jauhnya dari penyebabnya.
Rangkuman
- Tensor adalah array n-dimensi milik PyTorch; ia bisa berjalan di GPU dan melacak gradient.
- Buat dengan
torch.tensor,zeros,ones,arange,linspace,full,rand,randn; atur seed dengantorch.manual_seed. .shape/.size(),.ndim,.numel(),.dtype; float secara default float32.- Indexing seperti NumPy;
.item()mengambil angka Python. reshape,unsqueeze,squeezemengubah shape; konversi dtype dengan.float(),.long(),.to(...).