ใน ep ที่แล้วเราได้เรียนรู้คุณสมบัติพิเศษของ Tensor ที่มีประโยชน์ในการทำ Operation คณิตศาสตร์ ซึ่งเป็นการกระทำกับข้อมูลใน Tensor

แต่ใน ep นี้เราจะมาเจาะลึกลงไปถึงเรื่องการจัดการ รูปร่าง (Shape) หรือ มิติ (Dimension) ของ Tensor โดยที่ข้อมูลภายใน Tensor ทั้งหมดยังเหมือนเดิม จำนวน Element ใน Tensor ยังเท่าเดิม ไม่มีการแก้ไขข้อมูลใด ๆ

Geometric shapes in 2 dimensions. Credit: https://en.wikipedia.org/wiki/Geometric_shape#/media/File:Area.svg
Geometric shapes in 2 dimensions. Credit: https://en.wikipedia.org/wiki/Geometric_shape#/media/File:Area.svg

เรามาเริ่มกันเลยดีกว่า

Open In Colab

Tensor Shape and Dimension Manipulation

0. Import

In [2]:
import torch
from torch import tensor
In [3]:
a = tensor([[1, 2, 3], [4, 5, 6]])
a
Out[3]:
tensor([[1, 2, 3],
        [4, 5, 6]])

1. Flatten

Flattening ให้เป็น Vector (1 มิติ)

In [4]:
a.flatten()
Out[4]:
tensor([1, 2, 3, 4, 5, 6])

Transpose สลับมิติ Row กับ Column

In [5]:
a.t()
Out[5]:
tensor([[1, 4],
        [2, 5],
        [3, 6]])

Transpose แล้ว Flattening ตาม จะเห็นว่า Element เรียงตามมิติมากกว่าก่อน

In [6]:
a.t().flatten()
Out[6]:
tensor([1, 4, 2, 5, 3, 6])

Reshape กำหนดเองว่าจะเแปลง Tensor เป็น มิติ เท่าไรคูณเท่าไร

In [7]:
a.shape
Out[7]:
torch.Size([2, 3])
In [8]:
b = a.flatten()
b
Out[8]:
tensor([1, 2, 3, 4, 5, 6])

2. Reshape

Reshape ปรับรูปร่าง ปรับเปลี่ยนมิติของ Tensor โดยที่ไม่ได้ยุ่งกับข้อมูล

แปลงเป็น 2 x 3

In [9]:
b = b.reshape((2, 3))
b
Out[9]:
tensor([[1, 2, 3],
        [4, 5, 6]])

แปลงแบบไม่ระบุมิติ ด้วย -1

มิติ = -1 หมายถึงให้คำนวนเอา Element ที่เหลือมาใส่มิตินี้

In [10]:
a.reshape((2, -1))
Out[10]:
tensor([[1, 2, 3],
        [4, 5, 6]])
In [11]:
a.reshape((-1, 1))
Out[11]:
tensor([[1],
        [2],
        [3],
        [4],
        [5],
        [6]])
In [12]:
a.reshape((-1, 2))
Out[12]:
tensor([[1, 2],
        [3, 4],
        [5, 6]])
In [13]:
a.reshape((-1, 3))
Out[13]:
tensor([[1, 2, 3],
        [4, 5, 6]])
In [14]:
a.reshape((-1, 6))
Out[14]:
tensor([[1, 2, 3, 4, 5, 6]])

3. Squeeze

Squeeze คือ การยุบมิติ ที่มี element เดียว เช่น เรามี tensor 5 มิติ ที่มีมีติที่มี element เดียว อยู่ 2 มิติ คือ 1 และ 3 ดังด้านล่าง

In [15]:
x = torch.zeros(2, 1, 2, 1, 2)
x
Out[15]:
tensor([[[[[0., 0.]],

          [[0., 0.]]]],



        [[[[0., 0.]],

          [[0., 0.]]]]])
In [18]:
x.size()
Out[18]:
torch.Size([2, 1, 2, 1, 2])

squeeze จะยุบมิติ 1 และ 3 หายไป ทำให้จาก Tensor 5 มิติ เรากลายเป็น Tensor 3 มิติ

In [23]:
y = x.squeeze()
y
Out[23]:
tensor([[[0., 0.],
         [0., 0.]],

        [[0., 0.],
         [0., 0.]]])
In [24]:
y.size()
Out[24]:
torch.Size([2, 2, 2])

เราสามารถเลือกได้ว่า จะ Squeeze มิติที่เท่าไร

In [32]:
y = x.squeeze(1)
y.size()
Out[32]:
torch.Size([2, 2, 1, 2])

แต่ถ้ามิตินั้นมี element มากกว่า 1 ก็จะ squeeze ไม่ได้

In [33]:
y = x.squeeze(0)
y.size()
Out[33]:
torch.Size([2, 1, 2, 1, 2])

4. Unsqueeze

Unsqueeze คือ เพิ่มมิติ โดยที่มิติที่เพิ่มขึ้นมา มีแค่ element เดียว

In [47]:
x = torch.tensor([1, 2, 3, 4])
x
Out[47]:
tensor([1, 2, 3, 4])
In [46]:
x.size()
Out[46]:
torch.Size([4])
In [38]:
y = x.unsqueeze(0)
y
Out[38]:
tensor([[1, 2, 3, 4]])
In [39]:
y.size()
Out[39]:
torch.Size([1, 4])
In [40]:
y = x.unsqueeze(1)
y
Out[40]:
tensor([[1],
        [2],
        [3],
        [4]])
In [41]:
y.size()
Out[41]:
torch.Size([4, 1])

5. มิติ None

เพิ่มมิติ เหมือน unsqueeze ตัวอย่างเช่น ในการคำนวนเรียกฟังก์ชันบางอย่าง ต้องการ parameter 4 มิติ ทำให้เราต้องทำให้ tensor ของเราเป็น 4 มิติก่อนจะเรียกฟังก์ชันนั้นได้ โดยที่มิติที่สร้างขึ้นมาใหม่ ก็จะมีแค่ 1 Element นั่นเอง

In [52]:
z = tensor([1, 2, 3])
z
Out[52]:
tensor([1, 2, 3])

1 มิติ 3 Element

In [53]:
z.shape
Out[53]:
torch.Size([3])

จาก 1 มิติ เพิ่มมิติ Column ทำให้เป็น 2 มิติ คือ 3 Row 1 Column

In [54]:
z[:, None]
Out[54]:
tensor([[1],
        [2],
        [3]])
In [55]:
z[:, None].shape
Out[55]:
torch.Size([3, 1])

จาก 1 มิติ เพิ่มมิติ Row ไปด้านหน้า ทำให้เป็น 2 มิติ คือ 1 Row 3 Column

In [56]:
z[None]
Out[56]:
tensor([[1, 2, 3]])
In [57]:
z[None].shape
Out[57]:
torch.Size([1, 3])

6. ... จุดไข่ปลา Ellipsis

เครื่องหมาย ... จุดไข่ปลา Ellipsis หมายถึง ทุกมิติที่เหลือ

ลองดูแบบ เพิ่มจาก 2 มิติ เป็น 3 มิติ ดูบ้าง

In [58]:
a = tensor([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
a
Out[58]:
tensor([[1, 2, 3],
        [4, 5, 6],
        [7, 8, 9]])

เพิ่มด้านหลัง

In [59]:
a[..., None]
Out[59]:
tensor([[[1],
         [2],
         [3]],

        [[4],
         [5],
         [6]],

        [[7],
         [8],
         [9]]])
In [60]:
a[..., None].shape
Out[60]:
torch.Size([3, 3, 1])

เพิ่มด้านหน้า

In [61]:
a[None, ...]
Out[61]:
tensor([[[1, 2, 3],
         [4, 5, 6],
         [7, 8, 9]]])
In [62]:
a[None, ...].shape
Out[62]:
torch.Size([1, 3, 3])

เราจะใช้ tensor.reshape และ tensor.view ในการ reshape แต่มีข้อระวังคือ เราจะได้ผลลัพธ์เป็น view ของ tensor เดิมเท่านั้น ไม่ได้ tensor ใหม่ แยกกัน ถ้าอยากให้สร้าง tensor ใหม่ ให้ต่อด้วย tensor.copy

Credit

In [ ]:
 

แชร์ให้เพื่อน:

Keng Surapong on FacebookKeng Surapong on GithubKeng Surapong on Linkedin
Keng Surapong
Project Manager at Bua Labs
The ultimate test of your knowledge is your capacity to convey it to another.

Published by Keng Surapong

The ultimate test of your knowledge is your capacity to convey it to another.

Enable Notifications    Ok No thanks