Tensor Manipulation

이규호·2021년 1월 30일
0

📒 PyTorch Basic Tensor Manipulation


📝 Vector, Matrix and Tensor


  • 1D : Vector, 2D : Matrix, 3D : Tensor, nD는 Tensor를 확장

✏️ Tensor size

  • 2D Tensor : | t | = (batch size, dim)
  • 3D Tensor : | t | = (batch size, width or length, height or dim )

📝 NumPy Review


import numpy as np

# 1D Array with NumPy
>>> t = np.array([0., 1., 2., 3., 4., 5., 6.])
>>> print(t)
[0. 1. 2. 3. 4. 5. 6.]
>>> print(t.ndim) # Rank of t
1
>>> print(t.shape) # Shape of t
(7, )
>>> print(t[0], t[1], t[-1]) # Element
0.0 1.0 6.0
>>> print(t[2:5], t[4:-1] # Slicing
[2. 3. 4.] [4. 5.]
>>> print(t[:2], t[3:] #Slicing
[0. 1.] [3. 4. 5. 6.]

# 2D Array with NumPy
>>> t = np.array([[1., 2., 3.], [4., 5., 6.], [7., 8., 9.], [10., 11., 12.]])
>>> print(t)
[[1. 2. 3.]
 [4. 5. 6.]
 [7. 8. 9.]
 [10. 11. 12.]]
>>> print(t.ndim) # Rank of t
2
>>> print(t.shape) # Shape of t
(4, 3)

📝 PyTorch Tensor Allocation


import torch

# 1D Array with PyTorch
>>> t = torch.FloatTensor([0., 1., 2., 3., 4., 5., 6.])
>>> print(t)
tensor([0. 1. 2. 3. 4. 5. 6.])
>>> print(t.ndim) # Rank of t
1
>>> print(t.shape) # Shape of t
torch.Size([7])
>>> print(t.size()) # Shape of t
torch.Size([7])
>>> print(t[0], t[1], t[-1]) # Element
tensor(0.) tensor(1.) tensor(6.)
>>> print(t[2:5], t[4:-1] # Slicing
tensor([2. 3. 4.]) tensor([4. 5.])
>>> print(t[:2], t[3:] #Slicing
tensor([0. 1.]) tensor([3. 4. 5. 6.])

# 2D Array with PyTorch
>>> t = torch.FloatTensor([[1., 2., 3.], [4., 5., 6.], [7., 8., 9.], [10., 11., 12.]])
>>> print(t)
tensor([[1. 2. 3.]
        [4. 5. 6.]
        [7. 8. 9.]
        [10. 11. 12.]])
>>> print(t.ndim) # Rank of t
2
>>> print(t.size()) # Shape of t
torch.Size([4, 3])
>>> print(t[:, 1])
tensor([2., 5., 8., 11.])
>>> print(t[:, 1].size())
torch.Size([4])

📝 Matrix Multiplication


  • PyTorch는 자동으로 BroadCasting을 지원한다.
  • LongTensor, FloatTensor, ByteTensor 등이 있으며, .float() 등으로 형변환도 지원한다.
import torch

# 같은 shape여야 된다.
>>> m1 = torch.FloatTensor([[3, 3]])
>>> m2 = torch.FloatTensor([[2, 2]])
>>> print(m1 + m2)
tensor([[5., 5.]])

# vector + scalar 도 가능하다.
>>> m1 = torch.FloatTensor([[1, 2]])
>>> m2 = torch.FloatTensor([3]) # 3 -> [[3, 3]]
>>> print(m1 + m2)
tensor([[4., 5.]])

# 2 x 1 vector + 1 x 2 vector
>>> m1 = torch.FloatTensor([[1, 2]])
>>> m2 = torch.FloatTensor([[3], [4]])
>>> print(m1 + m2)
tensor([[4., 5.],
        [5., 6.]])
  • 행렬 곱은 matmul()으로 지원한다. (mul 과는 다르다)
>>> m1 = torch.FloatTensor([[1, 2], [3, 4]])
>>> m2 = torch.FloatTensor([[1],[2]])
>>> print(m1.matmul(m2)) # == m1 @ m2
tensor([[5.],
        [11.]])
>>> print(m1.mul_(m2)) # == m1 * m2
tensor([[1., 2.], 	   # _을 사용하면 메모리에 새로 선언하지 않고 연산이 가능하다.
        [6., 8.]])

📝 Other Basic Ops


# Mean
>>> t = torch.FloatTensor([1, 2]) # LongTensor는 불가능하다.
>>> print(t.mean())
tensor(1.5000)
>>> t = torch.FloatTensor([[1, 2], [3, 4]])
>>> print(t.mean())
tensor(2.5000)
>>> print(t.mean(dim=0)) # dimension 설정이 가능하다.
tensor([2., 3.])
>>> print(t.mean(dim=1))
tensor([1.5000, 3.5000])

# Sum
>>> print(t.sum())
tensor(10.)
>>> print(t.sum(dim=0))
tensor([4., 6.])

# Max, ArgMax
>>> print(t.max()) # Max 값 하나를 return
tensor(4.)
>>> print(t.max(dim=0)) # max, argmax 2개를 return
(tensor([3., 4.]), tensor([1, 1]))

📒 Tensor Utilization


📝 View (Reshape)


  • 모양을 다시 만들어주는 함수. NumPy의 Reshape와 완전 동일
>>> t = np.array([[[0, 1, 2],
                   [3, 4, 5]],
                   
                   [6, 7, 8],
                   [9, 10, 11]]])
>>> ft = torch.FloatTensor(t)
>>> print(ft.shape)
torch.Size([2, 2, 3])
>>> print(ft.view([-1, 3]))
tensor([[0., 1., 2.],
        [3., 4., 5.],
        [6., 7., 8.],
        [9., 10., 11.]])
>>> print(ft.view([-1, 3]).shape)
torch.Size([4, 3])

📝 Squeeze


  • Dimension이 1인 경우 없애준다.
>>> ft = torch.FloatTensor([[0], [1], [2]])
>>> print(ft.shape)
torch.Size([3, 1])
>>> print(ft.squeeze())
tensor([0., 1., 2.])
>>> print(ft.squeeze().shape)
torch.Size([3])

# unsqueeze는 반대 연산을 수행한다.
>>> print(ft.unsqueeze(1))
tensor([[0.],
        [1.],
        [2.]])

📝 Concatenate


  • cat 함수를 통해 결합도 가능하다.
>>> x = torch.FloatTensor([[1, 2], [3, 4]])
>>> y = torch.FloatTensor([[5, 6], [7, 8]])
>>> print(torch.cat([x, y], dim=0))
tensor([[1., 2.],
        [3., 4.],
        [5., 6.]
        [7., 8.]])
>>> print(torch.cat([x, y], dim=1))
tensor([[1., 2., 5., 6.],
        [3., 4., 7., 8.])

📝 Stacking


  • 사이즈가 같은 vector들을 쌓아준다.
>>> x = torch.FloatTensor([1, 4])
>>> y = torch.FloatTensor([2, 5])
>>> z = torch.FloatTensor([3, 6])
>>> print(torch.stack([x, y, z]))
tensor([[1., 4.],
        [2., 5.],
        [3., 6.]])
>>> print(torch.stack([x, y, z], dim=1))
tensor([[1., 2., 3.],
        [4., 5., 6.]])

📝 Ones and Zeros


  • 1 또는 0으로 채워준다.
>>> x = torch.FloatTensor([[0, 1, 2], [2, 1, 0]])
>>> print(x)
tensor([[0., 1., 2.],
        [2., 1., 0.]])
>>> print(torch.ones_like(x))
tensor([[1., 1., 1.],
        [1., 1., 1.]])
>>> print(torch.zeros_like(x))
tensor([[0., 0., 0.],
        [0., 0., 0.]])
profile
Beginner

0개의 댓글