파이토치(PyTorch) tutorial_1

☞   문서의 내용은 가장 하단 참고문헌 및 사이트를 참고하여 필자가 보기 쉽도록 정리한 내용입니다.

☞  틀린 내용 및 저작권 관련 문의가 있는 경우 문의하시면 수정 및 삭제 조치하겠습니다.


pytorch가 무엇인가?

Pyton기반의 과학 연산 패키지로 아래와 같은 두 집단을 대상으로 만들어졌다.

- Numpy를 대체하면서 GPU를 이용한 연산이 필요한 경우

- 최대한의 유연성과 속도를 제공하는 딥러닝 연구 플랫폼이 필요한 경우


Tensors

- tensor는 Numpy의 ndarray와 유사하며, GPU를 사용한 연산 가속이 가능하다.

초기화되지 않은 행렬이 생성되면 그 시점에 할당된 메모리에 존재하던 값들이 초기값으로 나타난다.

 

1. 초기화되지 않은 5x3 행렬을 생성

x = torch.empty(5, 3)
print(x)

# Out :
#tensor([[-4.3187e-33,  0.0000e+00,  0.0000e+00],
#        [ 0.0000e+00,  0.0000e+00,  0.0000e+00],
#        [ 0.0000e+00,  0.0000e+00, -2.4925e+03],
#        [ 4.5744e-41,  0.0000e+00,  0.0000e+00],
#        [        nan,  0.0000e+00,  1.6816e-44]])

 

2. 무작위로 초기화된 5x3 행렬 생성

x = torch.rand(5, 3)
print(x)

#Out :
#tensor([[0.3751, 0.9265, 0.2862],
#        [0.7077, 0.3262, 0.5856],
#        [0.4290, 0.5400, 0.4927],
#        [0.0629, 0.6212, 0.3383],
#        [0.8660, 0.5633, 0.1488]])

 

3. dtype이 long이고 0으로 채워진 행렬을 생성

x = torch.zeros(5, 3, dtype=torch.long)
print(x)

#Out :
#tensor([[0, 0, 0],
#        [0, 0, 0],
#        [0, 0, 0],
#        [0, 0, 0],
#        [0, 0, 0]])

 

4. 데이터로부터 tensor를 직접 생성

x = torch.tensor([5.5, 3])
print(x)

#Out :
#tensor([5.5000, 3.0000])

 

5. dtype이 double이고 1로 채워진 행렬을 생성

x = x.new_ones(5, 3, dtype=torch.double)
print(x)

#Out :
#tensor([[1., 1., 1.],
#        [1., 1., 1.],
#        [1., 1., 1.],
#        [1., 1., 1.],
#        [1., 1., 1.]], dtype=torch.float64)

 

6. 기존 Tensor를 바탕으로 새로운 tensor를 만든다.

x = x.new_ones(5, 3, dtype=torch.double)      # new_* 메소드는 크기를 받습니다
print(x)

x = torch.randn_like(x, dtype=torch.float)    # dtype을 오버라이드(Override) 합니다!
print(x)                                      # 결과는 동일한 크기를 갖습니다

#Out :
#tensor([[1., 1., 1.],
#        [1., 1., 1.],
#        [1., 1., 1.],
#        [1., 1., 1.],
#        [1., 1., 1.]], dtype=torch.float64)
#tensor([[ 0.3484,  2.3687,  1.8913],
#        [-0.4076,  0.3218,  2.5641],
#        [ 0.5478, -0.1723, -0.4435],
#        [-0.7180,  1.6165,  1.5621],
#        [-0.8697, -0.4903,  0.0836]])

 


연산(Operations)

1. 덧셈 : 문법1

y = torch.rand(5, 3)
print(x + y)

#Out :
#tensor([[ 0.7611,  2.4082,  2.0882],
#        [-0.0686,  0.7743,  2.6695],
#        [ 1.2113,  0.6225,  0.2882],
#        [ 0.1564,  1.8914,  1.6344],
#        [-0.1153, -0.2768,  0.1673]])

 

2. 덧셈 : 문법2

print(torch.add(x, y))

#Out : 
#tensor([[ 0.7611,  2.4082,  2.0882],
#        [-0.0686,  0.7743,  2.6695],
#        [ 1.2113,  0.6225,  0.2882],
#        [ 0.1564,  1.8914,  1.6344],
#        [-0.1153, -0.2768,  0.1673]])

 

3. 덧셈 : 결과 tensor를 인자로 제공

result = torch.empty(5, 3)
torch.add(x, y, out=result)
print(result)

#tensor([[ 0.7611,  2.4082,  2.0882],
#        [-0.0686,  0.7743,  2.6695],
#        [ 1.2113,  0.6225,  0.2882],
#        [ 0.1564,  1.8914,  1.6344],
#        [-0.1153, -0.2768,  0.1673]])

 

4. 덧셈 : 바꿔치기(in-place)방식

y.add_(x)
print(y)
#tensor([[ 0.7611,  2.4082,  2.0882],
#        [-0.0686,  0.7743,  2.6695],
#        [ 1.2113,  0.6225,  0.2882],
#        [ 0.1564,  1.8914,  1.6344],
#        [-0.1153, -0.2768,  0.1673]])
in-place방식으로 tensor의 값을 변경하는 연산 뒤에는 '_'가 붙는다.

 

5. Numpy스러운 인덱싱 표기 방법

print(x[:, 1])

#Out :
#tensor([ 2.3687,  0.3218, -0.1723,  1.6165, -0.4903])

 

6. 크기 변경: tensor의 크기(size)나 모양(shape)을 변경

x = torch.randn(4, 4)
y = x.view(16)
z = x.view(-1, 8)  # -1은 다른 차원에서 유추합니다.
print(x.size(), y.size(), z.size())

#Out : 
#torch.Size([4, 4]) torch.Size([16]) torch.Size([2, 8])

 

7. tensor에 하나의 값만 존재할 때 숫자 값 얻기

x = torch.randn(1)
print(x)
print(x.item())

#Out : 
#tensor([0.8994])
#0.8994463682174683

 


NumPy 변환(Bridge)

- Torch Tensor를 Numpy 배열로 변환하거나 그 반대로 하는 것은 매우 쉽다.

 

1. Torch Tensor를 numpy 배열로 변환하기

a = torch.ones(5)
print(a)
b = a.numpy()
print(b)
a.add_(1)
print(a)
print(b)

#Out :
#tensor([1., 1., 1., 1., 1.])
#[1. 1. 1. 1. 1.]
#tensor([2., 2., 2., 2., 2.])
#[2. 2. 2. 2. 2.]

 

2. Numpy 배열을 torch tensor로 변환하기

import numpy as np
a = np.ones(5)
b = torch.from_numpy(a)
np.add(a, 1, out=a)
print(a)
print(b)

#Out : 
#[2. 2. 2. 2. 2.]
#tensor([2., 2., 2., 2., 2.], dtype=torch.float64)

 


CUDA Tensors

- .to 메소드를 사용하여 Tensor를 어떠한 장치로도 옮길 수 있다.

# 이 코드는 CUDA가 사용 가능한 환경에서만 실행합니다.
# ``torch.device`` 를 사용하여 tensor를 GPU 안팎으로 이동해보겠습니다.

if torch.cuda.is_available():
    device = torch.device("cuda")          # CUDA 장치 객체(device object)로
    y = torch.ones_like(x, device=device)  # GPU 상에 직접적으로 tensor를 생성하거나
    x = x.to(device)                       # ``.to("cuda")`` 를 사용하면 됩니다.
    z = x + y
    print(z)
    print(z.to("cpu", torch.double))       # ``.to`` 는 dtype도 함께 변경합니다!
    
    

#Out :
#tensor([1.8994], device='cuda:0')
#tensor([1.8994], dtype=torch.float64)

 


참고문헌

 

PyTorch가 무엇인가요? — PyTorch Tutorials 1.6.0 documentation

Note Click here to download the full example code PyTorch가 무엇인가요? Python 기반의 과학 연산 패키지로 다음과 같은 두 집단을 대상으로 합니다: NumPy를 대체하면서 GPU를 이용한 연산이 필요한 경우 최대한

tutorials.pytorch.kr