Home [PyTorch] Tensor Manipulation1
Post
Cancel

[PyTorch] Tensor Manipulation1

파이토치(PyTorch)

  • 페이스북이 초기 루아(Lua) 언어로 개발된 토치(Torch)를 파이썬 버전으로 개발하여 2017년도에 공개
  • 초기에 토치(Torch)는 넘파이(NumPy) 라이브러리처럼 과학 연산을 위한 라이브러리로 공개
  • 이후 GPU를 이용한 텐서 조작 및 동적 신경망 구축이 가능하도록 딥러닝 프레임워크로 발전시킴
  • 파이썬답게 만들어졌고, 유연하면서도 가속화된 계산 속도를 제공

PyTorch 모듈 구조

image

PyTorch 구성요소

  • torch: 메인 네임스페이스, 텐서 등의 다양한 수학 함수가 포함
  • torch.autograd: 자동 미분 기능을 제공하는 라이브러리
  • torch.nn: 신경망 구축을 위한 데이터 구조나 레이어 등의 라이브러리
  • torch.multiprocessing: 병럴처리 기능을 제공하는 라이브러리
  • torch.optim: SGD(Stochastic Gradient Descent)를 중심으로 한 파라미터 최적화 알고리즘 제공
  • torch.utils: 데이터 조작 등 유틸리티 기능 제공
  • torch.onnx: ONNX(Open Neural Network Exchange), 서로 다른 프레임워크 간의 모델을 공유할 때 사용

텐서(Tensors)

  • 데이터 표현을 위한 기본 구조텐서(tensor)를 사용
  • 텐서는 데이터를 담기위한 컨테이너(container)로서 일반적으로 수치형 데이터를 저장
  • 넘파이(NumPy)의 ndarray와 유사
  • GPU를 사용한 연산 가속 가능

image

텐서 조작(Tensor Manipulation)

  • 텐서(Tensor)
  • 넘파이(NumPy)
  • 텐서 조작(Tensor Manipulation)
  • 브로드캐스팅(Broadcasting)
1
2
import numpy as np
import torch

NumPy

1D Array with NumPy

1
2
t = np.array([0., 1., 2., 3., 4., 5., 6.])
print(t)
1
[0. 1. 2. 3. 4. 5. 6.]
1
2
print('Rank of t :', t.ndim) # 몇 개의 차원? (Vector or Matrix or Tensor)
print('Sahpe of t' , t.shape) # 차원에 대한 element
1
2
Rank of t : 1
Sahpe of t (7,)
1
2
3
print(t[0], t[1], t[-1]) # Element
print(t[2:5]) # Slicing
print(t[:2], t[3:]) # Slicing
1
2
3
0.0 1.0 6.0
[2. 3. 4.]
[0. 1.] [3. 4. 5. 6.]

2D Array with NumPy

1
2
t = np.array([[1., 2., 3.], [4., 5., 6.], [7., 8., 9.], [10., 11., 12.]])
print(t) # 4 x 3
1
2
3
4
[[ 1.  2.  3.]
 [ 4.  5.  6.]
 [ 7.  8.  9.]
 [10. 11. 12.]]
1
2
3
# 2개의 차원(Matrix)은 각각의 차원에 4 x 3로 이루어져 있음
print('Rank of t :', t.ndim) # 몇 개의 차원? (Vector or Matrix or Tensor)
print('Sahpe of t' , t.shape) # 차원에 대한 element
1
2
Rank of t : 2
Sahpe of t (4, 3)

PyTorch

1D Array with PyTorch

1
2
t = torch.FloatTensor([0., 1., 2., 3., 4., 5., 6.])
print(t)
1
tensor([0., 1., 2., 3., 4., 5., 6.])
1
2
3
4
5
6
7
print(t.dim()) # Rank
print(t.shape) # Shape
print(t.size()) # Shape

print(t[0], t[-1]) # Element
print(t[2:5]) # Slocing
print(t[:2]) # Slicing
1
2
3
4
5
6
1
torch.Size([7])
torch.Size([7])
tensor(0.) tensor(6.)
tensor([2., 3., 4.])
tensor([0., 1.])

2D Arrya with PyTorch

1
2
3
4
5
6
t = torch.FloatTensor([[1., 2., 3.],
                       [4., 5., 6.],
                       [7., 8., 9.],
                       [10., 11., 12]
                       ])
print(t)
1
2
3
4
tensor([[ 1.,  2.,  3.],
        [ 4.,  5.,  6.],
        [ 7.,  8.,  9.],
        [10., 11., 12.]])
1
2
3
4
5
6
7
print(t.dim()) # Rank
print(t.shape) # Shape
print(t.size()) # Shape

print(t[0], t[-1]) # Element
print(t[2:5]) # Slocing
print(t[:2]) # Slicing
1
2
3
4
5
6
7
8
2
torch.Size([4, 3])
torch.Size([4, 3])
tensor([1., 2., 3.]) tensor([10., 11., 12.])
tensor([[ 7.,  8.,  9.],
        [10., 11., 12.]])
tensor([[1., 2., 3.],
        [4., 5., 6.]])

Broadcasting

1
2
3
4
# Same shape
m1 = torch.FloatTensor([[3, 3]])
m2 = torch.FloatTensor([[2, 2]])
print(m1 + m2)
1
tensor([[5., 5.]])
1
2
3
4
# Vector + Scalar
m1 = torch.FloatTensor([[1, 2]])
m2 = torch.FloatTensor([3]) # 3 -> [[3, 3]]
print(m1 + m2)
1
tensor([[4., 5.]])
1
2
3
4
# (2 x 1 Vector) + (1 x 2 Vector)
m1 = torch.FloatTensor([[1, 2]])
m2 = torch.FloatTensor([[3], [4]])
print(m1 + m2)
1
2
tensor([[4., 5.],
        [5., 6.]])

Multiplication vs Matrix Multiplication

1
2
3
4
5
6
7
print('--------------')
print('Mul vs Matmul')
print('--------------')
m1 = torch.FloatTensor([[1, 2], [3, 4]])
m2 = torch.FloatTensor([[1], [2]])
print('Shape of Matrix 1: ', m1.shape) # 2 x 2
print('Sahpe of Matrix 2: ', m2.shape) # 2 x 1
1
2
3
4
5
--------------
Mul vs Matmul
--------------
Shape of Matrix 1:  torch.Size([2, 2])
Sahpe of Matrix 2:  torch.Size([2, 1])
1
2
print(m1 * m2)
print(m1.mul(m2))
1
2
3
4
tensor([[1., 2.],
        [6., 8.]])
tensor([[1., 2.],
        [6., 8.]])

Mean

정수형(LongTensor)에서는 Mean을 사용할 수 없다.

1
2
t = torch.FloatTensor([1, 2])
print(t.mean())
1
tensor(1.5000)
1
2
t = torch.FloatTensor([[1, 2], [3, 4]])
print(t)
1
2
tensor([[1., 2.],
        [3., 4.]])
1
2
3
print(t.mean())
print(t.mean(dim=0)) # 2 x 2 -> 1 x 2
print(t.mean(dim=1)) # 2 x 2 -> 2 x 1
1
2
3
tensor(2.5000)
tensor([2., 3.])
tensor([1.5000, 3.5000])

Sum

1
2
3
print(t.sum())
print(t.sum(dim=0)) # 2 x 2 -> 1 x 2
print(t.sum(dim=1)) # 2 x 2 -> 2 x 1
1
2
3
tensor(10.)
tensor([4., 6.])
tensor([3., 7.])

Max and Argmax

1
print(t.max())
1
tensor(4.)
1
2
3
print(t.max(dim=0))
print('Max : ', t.max(dim=0)[0])
print('Argmax : ', t.max(dim=0)[1])
1
2
3
4
5
torch.return_types.max(
values=tensor([3., 4.]),
indices=tensor([1, 1]))
Max :  tensor([3., 4.])
Argmax :  tensor([1, 1])
1
print(t.max(dim=1))
1
2
3
torch.return_types.max(
values=tensor([2., 4.]),
indices=tensor([1, 1]))
This post is licensed under CC BY 4.0 by the author.