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.
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) # cputorch.Size([2, 3])
torch.float32
cpushape 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.
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 keduatorch.Size([4, 5])
torch.Size([4, 5])
2
4
5Metode .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.
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)torch.float32
RuntimeError: expected m1 and m2 to have the same dtype, but got: float != doublePenjumlahan 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.
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)False
cpuKeluaran 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.
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)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.shapemengembalikantorch.Size, yaitu tuple ukuran tiap dimensi, sedangkan.size()adalah padanan lamanya dan.dim()menghitung jumlah dimensi.x.dtypemenyatakan tipe data elemen. PyTorch mempromosikan dtype campuran pada sebagian operasi, tetapi operasi lain menuntut dtype yang sama persis.x.devicemenyatakan lokasi memori tensor,cpuataucuda, dan tensor dibuat dicpusecara default.- Setiap error operasi tensor didiagnosis dengan tiga pertanyaan: apakah bentuk, dtype, dan device kedua tensor cocok.
Referensi#
- PyTorch documentation — PyTorch
— Rujukan API untuk atribut
shape,dtype, dandevicebeserta kelastorch.Size. - Learn the Basics — PyTorch — Tutorial resmi yang bagian Tensors memperkenalkan atribut dasar tensor.