Python/PyTorch 공부

[PyTorch 튜토리얼] 파이토치에 대해서 - What is PyTorch

AI 꿈나무 2020. 11. 1. 23:11
반응형

 공부 목적으로 파이토치 튜토리얼 홈페이지를 번역해보았습니다.

 

What is PyTorch? — PyTorch Tutorials 1.7.0 documentation

Note Click here to download the full example code What is PyTorch? It’s a Python-based scientific computing package targeted at two sets of audiences: A replacement for NumPy to use the power of GPUs a deep learning research platform that provides maximu

pytorch.org

 

파이토치에 대해서 - What is PyTorch?

 2개의 집단을 목표로한 파이썬 기반 과학 계산 패키지 입니다.

  • GPU를 사용하기 위한 Numpy의 대체제
  • 유연성과 속도를 제공하는 딥러닝 연구 플랫폼

 

시작하기

Tensors

 Tensors는 Numpy의 ndarrays와 비슷하며, 추가적으로 계산을 빠르게 하기 위해 GPU에서 사용이 가능합니다.

 

from __future__ import print_function
import torch

 

Note
 초기화되지 않은 행렬이 선언되지 않았지만, 사용하기 전에  정확하게 알려진 값들을 포함하지 않습니다.
 초기화되지 않은 행렬이 생성 되었을 때, 그때 메모리에 할당된 어떤 값이든지 초기 값으로 나타날 것입니다.

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

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

 

Out:

tensor([[ 6.8576e+07,  4.5629e-41,  3.4296e+04],
        [ 3.0656e-41,  5.1725e+10,  7.0413e+15],
        [-6.2637e-10,  1.4842e+22,  9.2030e+14],
        [ 7.3787e-19,  3.1588e-29,  1.6175e-38],
        [ 4.5981e+34,         nan,  1.0947e-22]])

 

임의적으로 초기화된 행렬 생성

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

 

Out:

tensor([[0.6468, 0.0755, 0.2913],
        [0.3124, 0.6373, 0.4386],
        [0.4053, 0.4354, 0.5891],
        [0.6582, 0.7502, 0.6599],
        [0.9855, 0.4069, 0.0540]])

 

데이터 타입이 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]])

 

data로부터 직접 tensor 생성

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

 

Out:

tensor([5.5000, 3.0000])

 

기존에 존재하는 tensor에 기반한 tensor 생성하기

이 메소드는 유저에 의해 새로운 값들이 제공되지 않는다면, 입력 tensor의 성질들을 재사용 합니다. (e.g. dtype)

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

x = torch.randn_lize(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.2216, -0.0608, -0.6641],
        [ 0.8782,  1.4666,  0.4133],
        [ 0.8376, -0.4293,  0.9140],
        [ 0.1954,  1.1830, -0.5375],
        [-0.6112, -1.5640, -0.1305]])

 

행렬 사이즈 검출

print(x.size())

 

Out:

torch.Size([5, 3])

 

Note
 torch.Size는 튜플입니다.
 따라서 튜플 연산을 지원합니다.

연산 - Operations

 연산에는 다양한 문법들이 있습니다.

 다음의 예제에서 덧셈 연산을 살펴보겠습니다.

 

덧셈 : 문법 1

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

 

Out :

tensor([[-0.1270,  0.0530,  0.0508],
        [ 1.0932,  1.9178,  0.7669],
        [ 1.6982,  0.5159,  1.0761],
        [ 1.0950,  1.7699, -0.2970],
        [-0.1963, -0.6972,  0.8577]])

 

덧셈 : 문법 2

print(torch.add(x, y))

 

Out : 

tensor([[-0.1270,  0.0530,  0.0508],
        [ 1.0932,  1.9178,  0.7669],
        [ 1.6982,  0.5159,  1.0761],
        [ 1.0950,  1.7699, -0.2970],
        [-0.1963, -0.6972,  0.8577]])

 

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

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

 

Out :

tensor([[-0.1270,  0.0530,  0.0508],
        [ 1.0932,  1.9178,  0.7669],
        [ 1.6982,  0.5159,  1.0761],
        [ 1.0950,  1.7699, -0.2970],
        [-0.1963, -0.6972,  0.8577]])

 

덧셈 : in-place

 (별도의 보조 데이터 구조를 사용하지 않고 입력값 input을 변환하는 알고리즘, 교체 또는 교환을 통해서만 업데이트)

# x를 y에 더하기
y.add_(x)
print(y)

 

Out :

tensor([[-0.1270,  0.0530,  0.0508],
        [ 1.0932,  1.9178,  0.7669],
        [ 1.6982,  0.5159,  1.0761],
        [ 1.0950,  1.7699, -0.2970],
        [-0.1963, -0.6972,  0.8577]])

 

Note
 in-place로 tensor를 변형하는 연산은 뒤에 _가 붙습니다.
 예를 들어 x.copy_(y), x.t_()는 x를 변환합니다

Numpy와 같은 indexing 표기법을 사용할 수 있습니다.

print(x[:,1])

 

Out :

tensor([-0.0608,  1.4666, -0.4293,  1.1830, -1.5640])

 

크기 조정 : tensor를 resize/reshape하고 싶으면 torch.view를 사용할 수 있습니다.

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])

 

 

하나의 원소로 구성된 tensor를 갖고 있다면, 숫자 값을 얻기 위해 .item()를 사용합니다.

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

 

Out :

tensor([0.3417])
0.3417457342147827

 

추후에 읽을 거리

 전치(transposing), 인덱싱(indexing), 슬라이싱(slicing), 수학적인 연산, 선형대수학, 난수(random number) 등을 포함한 100가지 이상의 Tensor 연산을 여기에 기술되어 있습니다.

 

NumPy 변환(Bridge)

 Torch Tensor를 Numpy 배열로 전환하거나 그 반대도 가능합니다.

 

 (만약 Torch Tensor가 CPU에 있으면) Torch Tensor와 NumPy 배열은 기본 메모리 공간을 공유할 것입니다.

 그리고 하나를 변환하는 것은 다른 것도 변환합니다.

 

Torch Tensor를 NumPy로 변환

a = torch.ones(5)
print(5)

 

Out :

tensor([1., 1., 1., 1., 1.])

 

b = a.numpy()
print(b)

 

Out :

[1. 1. 1. 1. 1.]

 

어떻게 numpy 배열 값이 변경되는지 확인하기

a.add_(1)
print(a)
print(b)

 

Out :

tensor([2., 2., 2., 2., 2.])
[2. 2. 2. 2. 2.]

 

 a에 1을 더해줬더니 b의 값도 변경되었습니다.

 

NumPy Array를 Torch Tensor로 변환하기

 np array를 변경하면 어떻게 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)

 

 CharTensor를 제외한 CPU에 있는 모든 Tensor는 NumPy로 변환과 반대도 지원합니다.

 

CUDA Tensors

 Tensor는 .to 메서드를 사용해서 어떤 장치로 이동될 수 있습니다.

# 만약 CUDA를 이용가능할때만, 이 cell를 작동시킬 수 있습니다.
# tensor를 GPU에서 꺼내고 넣기 위해 ''torch.device'' 객체를 사용할 것입니다.

if torch.cuda.is_availabel():
    device = torch.device('cuda')         # CUDA 장치 객체
    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.3417], device='cuda:0')
tensor([1.3417], dtype=torch.float64)

 

반응형