본문 바로가기
파이썬 및 딥러닝 개념

[개념 정리] 신경망 모델 정의하기

by 쑤스토리 2022. 3. 31.

Pytorch로 신경망 모델을 정의할 때 생각해야 하는 것 3가지

 

  • Model 디자인
  • loss와 최적화 설계
  • Train Cycle (forward, backward, update)

 


첫 번째로 Class와 변수 정의 방법을 알아보자

 

  • 사용자 정의 nn 모듈
  • nn.Module을 상속한 Class 이용

 

Pytorch 모델의 기본 구조

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

class Model_Name(nn.Module):
	def __init__(self):
    
    	super(Model_Name, self).__init__()
        self.conv1 = nn.Conv2d()
        self.conv2 = nn.Conv2d()
        
    def forward(self,x):
    	
        x = funct1(x) #function like self.conv1/F.relu
        x = funct2(x)
        
		return x
        
model = Model_name() # put variable in here

 

Pytorch 모델로 쓰기 위해서는 다음 두 가지 조건을 따라야 한다.

 

  1.  torch.nn.Module 상속해야 한다 ( = nn.Module )
  2.  init( )과 forward( )를 override 해주기

상속이란 어떤 class를 만들 때 다른 class 기능을 그대로 가져오는 것을 말한다.

 

Override는 nn.Module에서 정의한 mothod를 자식 class 즉, 내가 현재 정의한 class Model_name에서 재정의 하는 것이다.

 

init( )에서는 모델에서 사용될 module (nn.Lienar, nn.Conv2d), activation function 등을 정의해준다.

 

forward( )에서는 모델에서 실행되어야 하는 계산을 정의해준다. Backward 계산은 backward( ) 함수를 이용하여 pytorch가 알아서 back propagation을 해주기 때문에 forward만 정의해주면 된다. Input을 넣어서 어떤 계산 과정을 통해 output이 나올지에 대해 정의해준다고 이해하면 된다.

 

nn.Module

 

Pytorch의 nn 라이브러리는 Neural Network의 모든 것을 포괄하는 모든 신경망 모델의 Base Class이다. 다른 말로 하면, 모든 신경망 모델은 nn.Module의 subclass라고 할 수 있다.

 

nn.Sequential을 사용한 신경망

 

nn.Sequential을 사용하면 init( )에서 사용할 네트워크 모델을 정의해줄 뿐 아니라, forward( ) 함수에서 구현될 순 전파를 layer 형태로 보다 가독성이 뛰어나게 코드 작성이 가능하다.

 

Train 함수에 꼭 필요한 내용들

def train(epoch):
	print('Epoch : %d', %epoch)
    
    model.train()

    for batch_idx, (data, target) in enumerate(train_loader):

        data, target = data.to(DEVICE), target.to(DEVICE)

        optimizer.zero_grad()

        output = model(data)

        loss = F.cross_entropy(output, target)

        loss.backward()

        optimizer.step()

 

model.train( )

모델을 학습 모드로 변환시켜준다. Evaluation 모드는 model.eval( )로 할 수 있다.

 

data, target = data.to(device), target.to(device) / data.cuda( ), target.cuda( )

각 data와 target을 앞서 설정한 device(GPU 혹은 CPU)에 보내는 것을 의미한다.

 

optimizer.zero_grad( )

반복 때마다 기울기를 새로 계산하므로, 이 함수로 초기화를 시켜준다.

 

output = model(data)

data를 모델에 넣어서 예측값을 획득한다.

 

loss = F.cross_entropy(output, target)

예측값과 ground truth를 비교하여 loss를 계산해주는 작업이다.

 

loss.backward( )

loss를 back propagation 알고리즘으로 계산한다.

 

optimizer.step( )

계산한 기울기를 앞서 정의한 알고리즘에 맞추어 가중치를 수정해주는 역할을 한다.

'파이썬 및 딥러닝 개념' 카테고리의 다른 글

[Label Noise] PENCIL 기법  (0) 2022.05.14
[Label Noise] Mix-Up 기법  (0) 2022.05.14

댓글