Python/PyTorch 공부

[PyTorch] 1. 예제로 배우는 파이토치 - Tensors

AI 꿈나무 2020. 12. 6. 16:46
반응형

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

 

Learning PyTorch with Examples — PyTorch Tutorials 1.7.0 documentation

Learning PyTorch with Examples Author: Justin Johnson This tutorial introduces the fundamental concepts of PyTorch through self-contained examples. At its core, PyTorch provides two main features: An n-dimensional Tensor, similar to numpy but can run on GP

pytorch.org

 

예제로 배우는 파이토치 - Learnong pytorch with examples

 이번 tutorial은 예제를 통해서 PyTorch의 필수적인 개념을 소개합니다.

 

 핵심으로 PyTorch는 두 가지 주요 특징을 제공합니다.

  • numpy와 유사한 n-차원 Tensor 이지만 GPU에서 실행 가능합니다.
  • 신경망 구축과 학습을 위한 자동 미분

 예제로 3차 polynomial 과 함께 y=sin(x)를 fitting 하는 문제를 사용할 것입니다.

 신경망은 4개의 매개변수를 갖고 있고, 신경망 출력과 정답 간의 유클리드 거리(Euclidean distance)를 최소화함으로써 임의의 데이터를 fit 하기 위한 경사 하강법으로 학습됩니다.

 

Tensors

준비운동 : numpy

 PyTorch를 소개하기 전에, numpy를 사용해서 신경망을 구현하겠습니다.

 

 Numpy는 n-차원 배열 객체와 이 배열들을 조작하기 위한 많은 기능을 제공합니다.

 Numpy는 과학적인 계산을 위한 포괄적인 framework 입니다.

 이것은 계산 그래프, 딥러닝, 변화도에 대해 아무것도 모릅니다.

 하지만 numpy 연산을 사용해서 신경망에 순전파와 역전파를 수동으로 구현함으로써 3차 polynomial를 sine 함수에 fit하기 위해 numpy를 쉽게 사용할 수 있습니다.

# -*- coding: utf-8 -*-
import numpy as np
import math

# 무작위 입력값과 결과값 생겅하기
x = np.linspace(-math.pi, math.pi, 2000)
y = np.sin(x)

# 가중치 무작위로 초기화하기
a = np.random.randn()
b = np.random.randn()
c = np.random.randn()
d = np.random.randn()

learning_rate = 1e-6
for t in range(2000):
    # 순전파 : 예측된 y 계산하기
    # y = a + b x + x^2 + d x^3
    y_pred = a + b * x + c * x ** 2 + d * x ** 3
    
    # 손실 계산하고 추력하기
    loss = np.square(y_pred - y).sum()
    if t % 100 = 99:
        print(t, loss)
        
    # 손실에 대한 a, b, c, d의 변화도를 계산하기 위한 역전파
    grad_y_pred = 2.0 * (y_pred - y)
    grad_a = grad_y_pred.sum()
    grad_b = (grad_y_pred * x).sum()
    grad_c = (grad_y_pred * x ** 2).sum()
    grad_d = (grad_y_pred * x ** 3).sum()
    
    # 가중치 갱신하기
    a -= learning_rate * grad_a
    b -= learning_rate * grad_b
    c -= learning_rate * grad_c
    d -= learning_rate * grad_d
    
print(f'Result: y = {a} + {b} x + {c} x^2 + {d} x^3')

 

PyTorch : Tensors

 Numpy는 좋은 framework 이지만 수치적인 연산을 가속화하기 위해 GPU를 활용할 수 없습니다.

 현대의 깊은 신경망에서 GPU는 50배 혹은 그 이상의 속도 향상을 제공하기 때문에, 안타깝게 numpy는 현대 딥러닝에는 충분하지 않습니다.

 

 여기서 가장 핵심적인 PyTorch 개념 Tensor를 소개합니다.

 PyTorch Tensor는 개념적으로 numpy 배열과 동일합니다.

 Tensor은 n-차원 배열이고 PyTorch는 Tensor를 연산하는 많은 기능을 제공합니다.

 Numpy 배열처럼 Tensor는 연산 그래프와 변화도에 대해 알지 못하지만 과학적인 계산을 위한 포괄적인 도구로서 유용합니다.

 

 또한 numpy와 달리, PyTorch Tensor는 수치적인 계산을 가속하기 위해 GPU를 활용할 수 있습니다.

 PyTorch Tensor를 GPU에서 실행하기 위해, 간단히 올바른 기기를 명시해야 합니다.

 

 3차 polynomial를 sine 함수에 fit하기 위해 PyTorch Tensor를 사용하겠습니다.

 위의 numpy 예제와 같이 신경망을 통과하는 순전파와 역전파를 수동으로 구현하겠습니다.

 

# -*- coding: utf-8 -*-

import torch
import math

dtype = torch.float
device = torch.device('cpu')
# device = torch.device('cuda:0') # GPU에서 실행하기 위해 이 주석을 제거하기

# 무작위 입력과 출력 데이터 생성하기
a = torch.randn((), device=device, dtype=dtype)
b = torch.randn((), device=device, dtype=dtype)
c = torch.randn((), device=device, dtype=dtype)
d = torch.randn((), device=device, dtype=dtype)

learning_rate = 1e-6
for t in range(2000):
    # 순전파 : 예측된 y 계산하기
    y_pred = a + b * x + c * x ** 2 + d * x ** 3
    
    # 손실을 계산하고 추력하기
    loss = (y_pred - y).pow(2).sum().item()
    if t % 100 == 99:
        print(t, loss)
        
    # 손실에 대한 a, b, c, d의 변화도를 계산하기 위한 역전파
    grad_y_pred = 2.0 * (y_pred - y)
    grad_a = grad_y_pred.sum()
    grad_b = (grad_y_pred * x).sum()
    grad_c = (grad_y_pred * x ** 2).sum()
    grad_d = (grad_y_pred * x ** 3).sum()
    
    # 경사 하강법을 사용해서 가중치 갱신하기
    a -= learning_rate * grad_a
    b -= learning_rate * grad_b
    c -= learning_rate * grad_c
    d -= learning_rate * grad_d
    
print(f'Result: y = {a.item()} + {b.item()} x + {c.item()} x^2 + {d.item()} x^3')

반응형