Deep Learning

PyTorch : class와 nn.Module 이용해서 신경망 모델 정의

응엉잉 2022. 8. 16. 13:02
  1. Design your model using class with Variables (class와 변수 정의)
  2. Construct loss and optim
  3. Train cycle (forward, backward, update)

PyTorch model의 기본 구조

import torch.nn as nn
import torch.nn.functional as F

class Model_Name(nn.Module): #nn.Module 상속
    def __init__(self):
    
        super(Model_Name, self).__init__()
        self.module1 = ...
        self.module2 = ...
        
        """
        ex)
        self.conv1 = nn.Conv2d(1, 20, 5)
        self.conv2 = nn.Conv2d(20, 20, 5)
        """

    def forward(self, x):
    
        x = some_function1(x)
        x = some_function2(x)
        
        """
        ex)
        x = F.relu(self.conv1(x))
        x = F.relu(self.conv2(x))
        """
        return x
        
model = Model_Name() # 여기에 변수를 넣어주면 됨.

PyTorch 모델을 사용하기 위해서는 nn.Module을 상속받아 온 후 __init()__과 forward()를 override 해야함

 * 상속 : 어떤 class를 만들 때 다른 class의 기능을 그대로 가지고 오는 것

 * override : 부모 class (torch.nn.Module)에 정의되어있는 method를 자식 class에서 변경하는 것

 

__init()__ : 모델에 사용할 module과 activation function을 정의 = 신경망 모델에 사용될 구성품들을 정의 및 초기화

 ex. module : nn.Linear, nn.Conv2d, 사용자가 정의 ...

 ex. activation function :nn.functional.relu, nn.functional.sigmoid

 

## module 과 activation function 이 뭔지에 대한 포스팅 정리하기 ##

 

forward(self, x) : 모델에서 실행되어야 하는 계산을 정의 = input을 넣어서 어떤 계산을 진행한 뒤 output을 돌려받는지를 정의 = __init()__ 에서 정의된 구성품들을 연결

 

nn.Module

Neural Network의 모든 것을 포괄하는 모든 신경망 모델의 Base Class

nn.Module을 상속한 subclass가 신경망 모델로 사용되기 위해선 __init()__과 forward(self, x)를 override 해야한다. 

 

  1. Design your model using class with Variables (class와 변수 정의)
  2. Construct loss and optim (loss와 optimizer 설정)
  3. Train cycle (forward, backward, update)

optimizer 설정

optimizer의 목적 : loss function의 최소값 찾기

PyTorch의 optim 패키지를 이용해서 정의

import torch.optim as optim


optimizer = optim.SGD([a, b], lr=lr)

for epoch in range(n_epochs):
    yhat = a + b * x_train_tensor
    error = y_train_tensor - yhat
    loss = (error ** 2).mean()

    loss.backward()

    optimizer.step()
    optimizer.zero_grad()

print(a, b)
  1. optimizer는 step() method를 통해 argument로 전달받은 parameter를 업데이트한다.
  2. 모델의 parameter별로(per-parameter) 다른 기준(learning rate 등)을 적용시킬 수 있다.
  3. torch.optim.Optimizer(params, defaults)는 모든 optimizer의 base class이다.
  4. nn.Module과 같이 state_dict()와 load_state_dict()를 지원하여 optimizer의 상태를 저장하고 불러올 수 있다.
  5. zero_grad() method는 optimizer에 연결된 parameter들의 gradient를 0으로 만든다.
  6. torch.optim.lr_scheduler는 epoch에 따라 learning rate를 조절할 수 있다.

loss 설정

loss = 모델의 추측 결과와 실제 정답이 얼마나 다른지(=model이 얼마나 틀리는지)

import torch.nn as nn

loss_fn = nn.MSELoss(reduction='mean')

optimizer = optim.SGD([a, b], lr=lr)

for epoch in range(n_epochs):
    yhat = a + b * x_train_tensor

    loss = loss_fn(y_train_tensor, yhat)

    loss.backward()
    optimizer.step()
    optimizer.zero_grad()

'Deep Learning' 카테고리의 다른 글

AutoEncoder와 anomaly detection  (0) 2022.08.17
PyTorch : Dataset과 DataLoader  (0) 2022.08.16
PCA  (0) 2022.08.16
self-supervised pre-training  (0) 2022.07.16
self-supervised learning  (0) 2022.07.15