Atribut tensor

Trio atribut yang selalu diperiksa: shape, dtype, dan device.

Daftar isi

Setiap tensor membawa tiga atribut yang menjawab pertanyaan paling mendasar: seberapa besar tensor itu, berisi tipe angka apa, dan berada di memori mana. Trio shape, dtype, dan device inilah yang diperiksa lebih dahulu setiap kali operasi tensor gagal, karena hampir semua error operasi tensor berakar pada ketidakcocokan salah satunya. Topik ini membahas cara membaca ketiganya, padanan metode lama yang masih banyak digunakan, serta kebiasaan diagnosa yang mempercepat penemuan penyebab error.

Ketiga atribut tersebut dapat dibaca sekaligus pada satu tensor, sebagaimana contoh berikut yang disimpan sebagai file periksa_atribut.py.

python periksa_atribut.py
import torch

x = torch.tensor([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]])  # (2, 3)

print(x.shape)   # (2, 3)
print(x.dtype)   # torch.float32
print(x.device)  # cpu
text Keluaran
torch.Size([2, 3])
torch.float32
cpu
tensor xshapetorch.Size([2, 3])dtypetorch.float32devicecpuukuran tiap dimensitipe data elemenlokasi memori tensor
Trio atribut tensor dan pertanyaan yang dijawab masing-masing

shape dan torch.Size#

Atribut shape menyatakan ukuran setiap dimensi dalam objek torch.Size, yaitu turunan tuple Python yang perilakunya sama dengan tuple biasa. Tensor dua dimensi berukuran dua baris dan tiga kolom menampilkan torch.Size([2, 3]), sedangkan tensor satu dimensi dengan tiga elemen menampilkan torch.Size([3]). Nilainya dapat dibandingkan, diindeks, atau dipecah sebagaimana tuple, sehingga bentuk tensor mudah diperiksa di dalam percabangan.

python Contoh: padanan pembacaan bentuk
import torch

x = torch.zeros(4, 5)  # (4, 5)

print(x.shape)    # (4, 5), bentuk tensor
print(x.size())   # (4, 5), metode lama yang setara dengan x.shape
print(x.dim())    # 2, jumlah dimensi
print(len(x))     # 4, ukuran dimensi pertama
print(x.shape[1]) # 5, ukuran dimensi kedua
text Keluaran
torch.Size([4, 5])
torch.Size([4, 5])
2
4
5

Metode .size() adalah padanan lama dari atribut .shape, dan keduanya mengembalikan nilai yang sama, sedangkan .dim() menghitung jumlah dimensinya. Pembacaan len(x) hanya mengembalikan ukuran dimensi pertama, sehingga kurang informatif untuk tensor berdimensi tinggi. Kebiasaan yang dianjurkan adalah x.shape untuk keperluan sehari-hari karena paling eksplisit.

dtype dan konsekuensinya#

Atribut dtype menyatakan tipe data elemen tensor, dan nilainya menentukan presisi, penggunaan memori, serta operasi yang diizinkan. Tipe bawaan sudah diperkenalkan pada topik pembuatan tensor, yaitu torch.int64 untuk bilangan bulat dan torch.float32 untuk bilangan desimal. PyTorch mempromosikan tipe secara otomatis pada operasi campuran, misalnya penjumlahan int64 dengan float32 menghasilkan float32, tetapi banyak operasi lain menuntut dtype yang sama persis.

python Contoh: promosi dtype dan error ketidakcocokan dtype
import torch

a = torch.ones(2, 2, dtype=torch.int64)    # (2, 2), int64
b = torch.ones(2, 2, dtype=torch.float32)  # (2, 2), float32

print((a + b).dtype)  # (2, 2), promosi otomatis ke float32

c = torch.ones(2, 2)                    # (2, 2), float32
d = torch.ones(2, 2, dtype=torch.float64)  # (2, 2), float64
try:
    c @ d  # (2, 2) @ (2, 2), perkalian matriks menuntut dtype sama
except RuntimeError as e:
    print("RuntimeError:", e)
text Keluaran
torch.float32
RuntimeError: expected m1 and m2 to have the same dtype, but got: float != double

Penjumlahan menerima campuran dtype dan mempromosikannya ke float32, sedangkan perkalian matriks menolak campuran float32 dan float64 dengan pesan error yang menyebut kedua tipe tersebut. Perbaikannya adalah menyamakan dtype terlebih dahulu, misalnya d.to(torch.float32), sebelum operasi dilakukan. Karena itulah x.dtype selalu dibaca bersama bentuk tensor setiap kali operasi gagal.

device dan lokasi memori#

Atribut device menyatakan lokasi penyimpanan tensor, yaitu perangkat yang menampung memorinya. Nilai cpu berarti tensor berada di memori utama komputer dan dihitung oleh prosesor, sedangkan nilai cuda berarti tensor berada di memori kartu grafis dan dihitung oleh GPU (graphics processing unit), prosesor khusus yang mempercepat perhitungan numerik besar. Tensor dibuat di device yang sama dengan sumber datanya, dan secara default device tersebut adalah cpu.

python Contoh: membaca device tensor
import torch

print(torch.cuda.is_available())  # True di mesin dengan GPU, False tanpa GPU

x = torch.ones(2, 3)  # (2, 3), dibuat di device bawaan
print(x.device)
text Keluaran
False
cpu

Keluaran di atas berasal dari mesin tanpa GPU, sehingga torch.cuda.is_available() melaporkan False dan tensor berada di cpu. Pada mesin pembaca yang memasang PyTorch berbasis CUDA, baris pertama menampilkan True. Cara memindahkan tensor antara device dibahas secara lengkap pada topik pindah ke GPU. Untuk saat ini, kebiasaan yang cukup adalah membaca x.device setiap kali kecurigaan muncul, karena dua tensor di device berbeda tidak dapat dioperasikan sama sekali.

Trio untuk diagnosa error#

Pesan error operasi tensor sering panjang, tetapi penyebabnya hampir selalu dapat dipersempit dengan tiga pertanyaan singkat: apakah bentuk kedua tensor cocok untuk operasi tersebut, apakah dtype keduanya sama, dan apakah keduanya berada di device yang sama. Urutan pemeriksaan itu mempercepat diagnosa karena setiap jawaban mengeliminasi satu kelompok penyebab. Contoh berikut memperlihatkan error bentuk yang paling sering ditemui, yaitu perkalian matriks dengan ukuran yang tidak cocok.

python Contoh: error perkalian matriks dan diagnosa trio
import torch

a = torch.ones(2, 3)  # (2, 3)
b = torch.ones(4, 5)  # (4, 5)
try:
    a @ b  # (2, 3) @ (4, 5), dimensi dalam tidak cocok
except RuntimeError as e:
    print("RuntimeError:", e)
text Keluaran
RuntimeError: mm: mat1 and mat2 shapes cannot be multiplied (2x3 and 4x5)

Pesan error tersebut menyebut pasangan bentuk 2x3 dan 4x5 secara eksplisit. Perkalian matriks menuntut jumlah kolom tensor pertama sama dengan jumlah baris tensor kedua, yaitu 3 melawan 4, sehingga operasi ditolak. Di sinilah trio atribut bekerja sebagai satu paket: a.shape dan b.shape mengonfirmasi bentuk yang tercantum pada pesan error, lalu a.dtype dan a.device mengeliminasi dua kelompok penyebab lainnya. Kebiasaan menempelkan keluaran ketiga atribut di dekat kode yang bermasalah menghemat waktu pencarian penyebab.

Ringkasan#

  • x.shape mengembalikan torch.Size, yaitu tuple ukuran tiap dimensi, sedangkan .size() adalah padanan lamanya dan .dim() menghitung jumlah dimensi.
  • x.dtype menyatakan tipe data elemen. PyTorch mempromosikan dtype campuran pada sebagian operasi, tetapi operasi lain menuntut dtype yang sama persis.
  • x.device menyatakan lokasi memori tensor, cpu atau cuda, dan tensor dibuat di cpu secara default.
  • Setiap error operasi tensor didiagnosis dengan tiga pertanyaan: apakah bentuk, dtype, dan device kedua tensor cocok.

Referensi#