DataLens

Tensor: pembuatan dan dasar-dasarnya

Kenali tensor, array milik PyTorch, buat tensor dengan cara-cara yang umum, dan baca shape serta dtype-nya, dengan latihan NumPy yang bisa langsung dijalankan di sini.

Level: Dasar · 8 menit baca

Latihan modul ini

Soal-soal untuk pelajaran ini berjalan di browser-mu dan langsung mengecek jawabanmu.

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:

  1. ia bisa berada di GPU, tempat perhitungan atas jutaan angka berjalan jauh lebih cepat;
  2. 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
Ide utama

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

Latihan modul ini

Soal-soal untuk pelajaran ini berjalan di browser-mu dan langsung mengecek jawabanmu.

Berikutnya: Operasi tensor dan broadcasting →