CS/ML+DL

PyTorch Basics(2)

esmJK 2021. 8. 24. 21:29

Referred to :

Prof. Sung Kim's PyTorch Lecture

PyTorch Official Documentation : www.pytorch.org

 

PyTorch에서 모델을 만들고 학습시키는 것은 다음과 같은 절차를 거칩니다. 

 

PyTorch ML Procedure

Step 1. Design your model using class with Variables 

Step 2. Construct loss and optimizer (Select from PyTorch API) 

Step 3. Training Cycle (forward, backward, update) 

import torch
from torch.autograd import Variable

# Step 1
x_data = Variable(torch.Tensor([[1.0], [2.0], [3.0]]))
y_data = Variable(torch.Tensor([[2.0], [4.0], [6.0]]))

class Model(torch.nn.Module):
    def __init__(self):
        super(Model, self).__init__()
        self.linear = torch.nn.Linear(1, 1)

    def forward(self, x):
        y_pred = self.linear(x)
        return y_pred

model = Model()

# Step 2
criterion = torch.nn.MSELoss(reduction='sum')
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)

# Step 3
for epoch in range(500):
    # Forward pass : Compute predicted y by passing x to the model
    y_pred = model(x_data)

    # Compute and print loss
    loss = criterion(y_pred, y_data)
    print(epoch, loss.item())

    # Zero gradients, perform a backward pass, and update the weights
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

# After training
hour_var = Variable(torch.Tensor([4.0]))
print("predict (after training)", 4, model.forward(hour_var).data.item())

 

Step 1

 

데이터를 정의하고 모델을 만드는 단계입니다. 

x_data = Variable(torch.Tensor([[1.0], [2.0], [3.0]])) Tensor가 3 * 1 행렬과 같음을 의미합니다. 
Model torch.nn.Module의 subclass 입니다
torch.nn.Linear(1, 1) 데이터 입력과 출력이 각각 1개씩 임을 의미합니다. 하나의 x 값을 입력받고, 하나의 y 값을 출력시키기 때문입니다. 
모델은 forward() 함수가 꼭 존재해야 합니다 forward(self, x) 함수에서는 x 를 입력으로 받고 y 의 값을 예측하도록 합니다. 우리가 직접 w 를 정의하지 않았으나, 모델에서 알아서 생성해서 연산하도록 self.linear() 를 호출합니다

 

Step 2 

 

API를 이용하여 loss를 정의하고 optimizer를 설정합니다. 

이번 예제의 경우 Stochastic Gradient Descent Algorithm을 사용하였습니다. lr 은 learning rate를 의미합니다. 

MSELoss(size_average=False)  linear regression이 필요하기 때문에 설정되었습니다. 
SGD(model.parameters(), lr=0.01 optimizer를 만들 때 parameter를 넘겨주어야 합니다. 어떤 variable을 지속적으로 수정해야하는지를 알려줍니다. 

 

Step 3 

 

Training 단계에서는 forward, loss, backward, step 을 따릅니다. 

y_pred = model(x_data) 모델에 x_data를 넣어줍니다. x_data가 metric이라는 점을 숙지해야 합니다. 
loss = criterion(y_pred, y_data) MSE를 이용하여 loss를 계산하도록 합니다. 
loss.backward() 모든 variable에 대한 backward propagation을 진행합니다. 
optimizer.step() variable을 최신화합니다. 어떤 variable을 최신화 해야하는지는 SGD(model.parameters()) 에서 정의하였습니다. 

Training이 끝나면 모델을 테스트해보기 위해 

model.forward()를 돌려보고, 예측한 값이 정확한지 확인합니다. 

0 22.69832420349121
1 10.237281799316406
2 4.688072681427002
3 2.21584153175354
4 1.113423466682434
5 0.6208343505859375
6 0.3997485637664795
...
496 0.00018690848082769662
497 0.0001842272758949548
498 0.0001815779833123088
499 0.00017896962526720017
predict (after training) 4 7.984621524810791

 

torch.optim 에는 다양한 optimizer가 존재합니다. 

Adagrad, Adam, Adamax, ASGD, LBFGS, RMSprop, Rprop, SGD 등이 있습니다. 

 


PyTorch를 이용해 Linear Regression을 진행하였으니, API에 관한 이해가 필요합니다.

 

Tensor는 Input과 Output을 표현할 때 사용합니다. Numpy와 비슷한 기능을 하지만, GPU를 사용할 수 있도록 설계된 것이 가장 큰 장점입니다. Tensor 를 복제하며 data type를 보존하거나, override 할 수 있습니다. override 할 경우에는 dtype를 인자에 넣어주도록 합니다. 

import torch
import numpy as np

data = [[1, 2], [3, 4]]
x_data = torch.tensor(data)

x_ones = torch.ones_like(x_data)
print(f"Ones Tensor: \n {x_ones} \n")

x_rand = torch.rand_like(x_data, dtype=torch.float)
print(f"Random Tensor: \n {x_rand} \n")

shape 튜플에 Tensor의 모양을 저장할 수 있으며, Tensor가 어떤 하드웨어에서 동작하는지도 알 수 있습니다. 

import torch

shape = (2, 3,)
rand_tensor = torch.rand(shape)
print(f"Size is {rand_tensor.shape}")
print(f"Device Tensor is stored on {rand_tensor.device}")
Size is torch.Size([2, 3])
Device Tensor is stored on cpu

 

'CS > ML+DL' 카테고리의 다른 글

[Principles][3]Backpropagation  (0) 2023.02.07
[Principles][2]Mathematical Notation for Artificial Neural Networks  (0) 2023.02.06
[Principles][1]Artificial Neural Network  (0) 2023.02.05
CUDA + cuDNN + Anaconda Setup  (0) 2022.06.11
PyTorch Basics(1)  (0) 2021.08.24