torch.stack
PyTorch adalah perpustakaan pembelajaran mesin open-source populer yang semakin digunakan oleh peneliti dan pengembang. PyTorch menyediakan berbagai alat untuk membantu dalam membuat dan melatih model pembelajaran mendalam. Salah satu fungsi inti dari PyTorch adalah torch.stack
, yang merupakan fungsi kuat yang digunakan untuk menggabungkan tensor pada dimensi baru.
Tujuan dari torch.stack
adalah untuk mengambil urutan tensor dan menggabungkannya pada dimensi baru. Dimensi baru ini dapat ditentukan sebagai dimensi pertama, tengah, atau terakhir dari tensor hasil. Tensor input harus memiliki bentuk yang sama pada semua dimensi kecuali dimensi baru.
Ada beberapa keuntungan dalam menggunakan torch.stack
. Salah satu keuntungan utamanya adalah memungkinkan Anda menggabungkan beberapa tensor menjadi satu tensor dengan dimensi baru dengan mudah. Ini sangat berguna ketika bekerja dengan data multi-dimensi, seperti gambar atau video, di mana Anda mungkin ingin menggabungkan bingkai atau saluran data.
Keuntungan lain dari menggunakan torch.stack
adalah menyediakan cara yang sederhana dan efisien untuk memanipulasi dan mengubah tensor di PyTorch. Dengan fungsi ini, Anda dapat membuat tensor yang lebih kompleks dengan menggabungkan yang lebih sederhana, dan dengan mudah mengubah bentuk dan struktur data Anda. Ini dapat sangat membantu ketika menangani data batch atau ketika bekerja dengan operasi tensor yang membutuhkan bentuk tensor tertentu.
Sintaks dan Parameter
Artikel ini akan membahas sintaks dan parameter dari torch.stack
, serta memberikan beberapa contoh untuk mendemonstrasikan penggunaannya.
Sintaks dan Parameter dari torch.stack
Sintaks untuk torch.stack
adalah sebagai berikut:
torch.stack(tensors, dim=0, out=None)
Parameter dari torch.stack
adalah sebagai berikut:
Parameter | Deskripsi |
---|---|
tensors |
Urutan tensor yang akan disusun. Mereka harus memiliki bentuk yang sama di semua dimensi kecuali dimensi yang disusun. |
dim |
Dimensi baru di mana tensor akan disusun. Ini dapat menjadi bilangan bulat positif atau negatif atau tuple bilangan bulat. Secara default, dim diatur ke 0, yang berarti tensor akan disusun di sepanjang dimensi pertama. |
out |
Tensor keluaran opsional. Jika diberikan, hasilnya akan ditulis ke tensor ini. |
Contoh penggunaan torch.stack
Berikut adalah beberapa contoh penggunaan torch.stack
untuk menumpuk tensor:
import torch
# Example 1: stacking 2D tensors along a new dimension
a = torch.tensor([[1, 2], [3, 4]])
b = torch.tensor([[5, 6], [7, 8]])
result = torch.stack((a, b), dim=0)
print(result)
# Output:
# tensor([[[1, 2],
# [3, 4]],
#
# [[5, 6],
# [7, 8]]])
# Example 2: stacking 1D tensors along a new dimension
c = torch.tensor([1, 2, 3])
d = torch.tensor([4, 5, 6])
result = torch.stack((c, d), dim=1)
print(result)
# Output:
# tensor([[1, 4],
# [2, 5],
# [3, 6]])
# Example 3: stacking 3D tensors along a new dimension
e = torch.tensor([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
f = torch.tensor([[[9, 10], [11, 12]], [[13, 14], [15, 16]]])
result = torch.stack((e, f), dim=1)
print(result)
# Output:
# tensor([[[[ 1, 2],
# [ 3, 4]],
#
# [[ 9, 10],
# [11, 12]]],
#
# [[[ 5, 6],
# [ 7, 8]],
#
# [[13, 14],
# [15, 16]]]])
Pada contoh pertama, kita melakukan stack pada dua tensor 2D sepanjang dimensi pertama, menghasilkan tensor 3D dengan bentuk (2, 2, 2)
.
Pada contoh kedua, kita melakukan stack pada dua tensor 1D sepanjang dimensi kedua, menghasilkan tensor 2D dengan bentuk (3, 2)
.
Pada contoh ketiga, kita melakukan stack pada dua tensor 3D sepanjang dimensi kedua, menghasilkan tensor 4D dengan bentuk (2, 2, 2, 2)
.
Parameter dim pada torch.stack
Parameter dim
pada torch.stack
menentukan dimensi tempat tensor-tensor input akan di-stack. Secara default, dim
diatur pada 0, yang berarti tensor-tensor akan di-stack sepanjang dimensi pertama. Namun, Anda dapat menentukan dimensi apa saja dengan cara memasukkan bilangan bulat atau tuple bilangan bulat ke dalam parameter dim
.
Ketika Anda melakukan stack pada tensor-tensor sepanjang dimensi baru, tensor hasilnya akan memiliki satu dimensi tambahan. Sebagai contoh, jika Anda melakukan stack pada dua tensor 2D sepanjang dimensi kedua, maka tensor hasilnya akan memiliki tiga dimensi. Ukuran dimensi baru tersebut akan sama dengan jumlah tensor input.
Berikut adalah beberapa contoh yang menunjukkan bagaimana menggunakan parameter dim pada torch.stack untuk melakukan stack pada tensor sepanjang dimensi yang berbeda:
import torch
# create two tensors of shape (2, 3)
a = torch.tensor([[1, 2, 3], [4, 5, 6]])
b = torch.tensor([[7, 8, 9], [10, 11, 12]])
# stack the tensors along the first dimension
result = torch.stack((a, b), dim=0)
print(result)
# Output:
# tensor([[[ 1, 2, 3],
# [ 4, 5, 6]],
#
# [[ 7, 8, 9],
# [10, 11, 12]]])
# stack the tensors along the second dimension
result = torch.stack((a, b), dim=1)
print(result)
# Output:
# tensor([[[ 1, 2, 3],
# [ 7, 8, 9]],
#
# [[ 4, 5, 6],
# [10, 11, 12]]])
# stack the tensors along the third dimension
result = torch.stack((a, b), dim=2)
print(result)
# Output:
# tensor([[[ 1, 7],
# [ 2, 8],
# [ 3, 9]],
#
# [[ 4, 10],
# [ 5, 11],
# [ 6, 12]]]])
Dalam contoh pertama, kita menumpuk dua tensor 2D a
dan b
sepanjang dimensi pertama dengan mengatur dim=0
. Ini menghasilkan tensor dengan bentuk (2, 2, 3)
, dengan dimensi pertama yang sesuai dengan jumlah tensor input, dan dimensi kedua dan ketiga yang sesuai dengan ukuran tensor input.
Pada contoh kedua, kita menumpuk tensor yang sama a
dan b
sepanjang dimensi kedua dengan mengatur dim=1
. Ini menghasilkan tensor dengan bentuk (2, 3, 2)
, dengan dimensi pertama yang sesuai dengan jumlah tensor input, dan dimensi kedua dan ketiga yang sesuai dengan ukuran tensor input sepanjang dimensi kedua dan pertama, masing-masing.
Pada contoh ketiga, kita menumpuk tensor yang sama a
dan b
sepanjang dimensi ketiga dengan mengatur dim=2
. Ini menghasilkan tensor dengan bentuk (2, 3, 2)
, dengan dimensi pertama yang sesuai dengan ukuran tensor input sepanjang dimensi pertama, dan dimensi kedua dan ketiga yang sesuai dengan ukuran tensor input sepanjang dimensi kedua dan ketiga, masing-masing.
Perbedaan antara torch.stack dan fungsi PyTorch lainnya
PyTorch menyediakan beberapa fungsi untuk memanipulasi tensor, termasuk torch.stack
, torch.cat
, dan torch.chunk
. Dalam artikel ini, saya akan membahas perbedaan antara torch.stack
dan fungsi PyTorch lainnya ini, dengan contoh untuk menunjukkan penggunaannya.
torch.stack vs. torch.cat
torch.cat
adalah fungsi PyTorch yang menggabungkan tensor sepanjang dimensi yang diberikan. Ini mengambil urutan tensor sebagai input, tetapi tidak seperti torch.stack
, ia memerlukan bahwa tensor input memiliki bentuk yang sama sepanjang semua dimensi, termasuk dimensi yang digabungkan.
Berikut adalah contoh yang menunjukkan perbedaan antara torch.stack
dan torch.cat
:
import torch
# Example 1: stacking tensors with torch.stack
a = torch.tensor([1, 2, 3])
b = torch.tensor([4, 5, 6])
result = torch.stack((a, b))
print(result)
# Output:
# tensor([[1, 2, 3],
# [4, 5, 6]])
# Example 2: concatenating tensors with torch.cat
c = torch.tensor([[1, 2, 3], [4, 5, 6]])
d = torch.tensor([[7, 8, 9], [10, 11, 12]])
result = torch.cat((c, d), dim=0)
print(result)
# Output:
# tensor([[ 1, 2, 3],
# [ 4, 5, 6],
# [ 7, 8, 9],
# [10, 11, 12]])
Pada Contoh 1, kita menggunakan torch.stack
untuk menggabungkan dua tensor 1D menjadi sebuah tensor 2D tunggal. Pada Contoh 2, kita menggunakan torch.cat
untuk menggabungkan dua tensor 2D sepanjang dimensi pertama. Perlu diingat bahwa torch.cat membutuhkan input tensor yang memiliki dimensi yang sama, termasuk dimensi yang digabungkan, sedangkan torch.stack
hanya membutuhkan input tensor dengan dimensi yang sama kecuali dimensi yang digabungkan.
torch.stack vs. torch.chunk
torch.chunk
adalah fungsi PyTorch yang memisahkan sebuah tensor menjadi beberapa bagian sepanjang dimensi yang ditentukan. Berbeda dengan torch.stack
dan torch.cat
, fungsi ini tidak menggabungkan tensor menjadi satu tensor. Sebaliknya, ia mengembalikan tuple dari beberapa bagian.
Berikut adalah contoh yang menunjukkan perbedaan antara torch.stack
dan torch.chunk
:
import torch
# Example 1: stacking tensors with torch.stack
a = torch.tensor([1, 2, 3, 4])
b = torch.tensor([5, 6, 7, 8])
result = torch.stack((a, b), dim=1)
print(result)
# Output:
# tensor([[1, 5],
# [2, 6],
# [3, 7],
# [4, 8]])
# Example 2: splitting tensors with torch.chunk
c = torch.tensor([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]])
result = torch.chunk(c, 2, dim=0)
print(result)
# Output:
# (tensor([[1, 2, 3],
# [4, 5, 6]]),
# tensor([[ 7, 8, 9],
# [10, 11, 12]]))
Pada Contoh 1, kita menggunakan torch.stack
untuk menggabungkan dua tensor 1D menjadi satu tensor 2D dengan bentuk (4, 2)
. Pada Contoh 2, kita menggunakan torch.chunk untuk membagi tensor 2D sepanjang dimensi pertama menjadi dua bagian yang sama besar. Hasilnya adalah tupel dari dua tensor, masing-masing dengan bentuk (2, 3)
. Perlu diingat bahwa torch.chunk
tidak menggabungkan tensor menjadi satu tensor, melainkan membagi tensor menjadi tensor yang lebih kecil.
Pertimbangan Kinerja dan Memori
Meskipun torch.stack
adalah fungsi yang kuat dan fleksibel untuk memanipulasi tensor di PyTorch, fungsi ini dapat memengaruhi kinerja dan penggunaan memori yang harus diperhatikan ketika menggunakannya dalam model deep learning Anda.
Pertimbangan Kinerja
Salah satu pertimbangan kinerja penting ketika menggunakan torch.stack
adalah overhead pembuatan tensor baru. Menggabungkan tensor dapat menjadi operasi yang membutuhkan banyak resource, terutama ketika bekerja dengan tensor besar atau saat menggabungkan banyak tensor bersama-sama. Hal ini dapat memengaruhi kecepatan model deep learning Anda, terutama jika Anda melakukan banyak operasi yang melibatkan penggabungan tensor.
Salah satu cara untuk mengurangi overhead kinerja dari torch.stack
adalah dengan menggunakan operasi in-place, yang dapat menghemat memori dan waktu komputasi dengan memodifikasi tensor masukan secara langsung daripada membuat tensor baru. Versi in-place dari torch.stack
disebut torch.stack_
, dan beroperasi dengan cara yang sama seperti torch.stack tetapi memodifikasi tensor masukan secara langsung.
Pertimbangan Memori
Pertimbangan penting lainnya ketika menggunakan torch.stack
adalah penggunaan memori. Menggabungkan tensor dapat meningkatkan penggunaan memori pada model deep learning Anda, terutama jika Anda menggabungkan banyak tensor besar bersama-sama atau menggabungkan tensor sepanjang beberapa dimensi.
Salah satu cara untuk mengurangi penggunaan memori saat menggunakan torch.stack
adalah dengan menggunakan parameter out, yang memungkinkan Anda untuk menentukan tensor output yang sudah ada yang akan digunakan untuk menyimpan hasil operasi. Hal ini dapat sangat berguna ketika bekerja dengan tensor besar, karena dapat mengurangi jumlah memori yang diperlukan untuk menyimpan hasil operasi.
Cara lain untuk mengurangi penggunaan memori adalah dengan menggunakan fungsi torch.cat
daripada torch.stack, karena torch.cat
dapat menggabungkan tensor sepanjang dimensi yang sudah ada daripada membuat dimensi yang baru. Ini dapat menjadi cara yang lebih efisien dalam penggunaan memori untuk menggabungkan tensor dalam beberapa kasus.