본문 바로가기
A.I./PyTorch

PyTorch 문서) PyTorch Recipes - Defining a Neural Network

by 채소장사 2024. 9. 29.

신경망 정의

  • 원글 : Defining a Neural Network in PyTorch
  • 딥러닝은 서로 연결된 수많은 레이어로 구성된 인공신경망(ANN, artificial Neural Network) 모델이다.
  • 이렇게 상호연결된 층으로 데이터를 흘려보냄으로써, 입력값과 출력값이 대응되는 연산을 근사하는 방식을 신경망은 학습할 수 있다.
  • PyTorch에서는 torch.nn 패키지를 사용해서 신경망을 구성할 수 있다.

Introduction

  • PyTorch에서는 torch.nn 패키지에 포함된 모듈과 클래스를 활용하여, 신경망을 생성하고 학습할 수 있다.
  • nn.Module이 포함한 층(layer)에서 forward(input) 메소드를 거쳐 output이 반환된다.
  • 이 문서에서는 MNIST 데이터셋에 대한 신경망을 torch.nn을 사용해 정의한다.

Setup

  • 시작하기 전에 torch를 설치할 필요가 있다.
pip install torch

Steps

  1. 데이터를 로드하기 위해 필요한 라이브러리를 불러온다.
  2. 신경망을 정의하고 초기화한다.
  3. 데이터가 모델에서 어떤 층을 거치는지 명시한다.
  4. (선택적으로) 테스트를 위한 데이터를 모델에 사용해본다.

1. 데이터를 로드하기 위해, 필요한 라이브러리 불러오기

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

2. 신경망의 정의 및 초기화

  • MNIST 데이터셋에 대한 신경망은 이미지를 인식해야 하므로, PyTorch의 컨볼루션(convolution)연산을 사용한다.
  • 컨볼루션(Convolution)은 이미지의 각 요소에 해당하는 픽셀값을 커널(kernel)이라 불리는 작은 행렬로 가중치가 곱해진 주위 픽셀값들과 더해준다.
    • 이를 통해 입력이미지에서 임의의 특성을 추출할 수 있다.
    • 참고) 기존 이미지 처리에서 필터(filter)라고도 불린 컨볼루션(합성곱) 연산을 통해 이미지를 부드럽고 흐리게 만드는 블러링(blurring), 이미지를 날카롭게 만드는 샤프닝(sharpening) 등이 가능하고, 또 모서리와 같은 이미지 내의 특징을 추출할 수 있다(edge detection)
  • 아래에서 Net이라고 이름붙인 모델을 정의하기 위해서 우선 nn.Module을 참고하는 __init__ 함수를 작성한다.
    • __init__()에서 신경망에 사용되는 레이어들을 선언할 수 있다.
  • 아래의 모델은 컨볼루션 레이어를 사용해, 하나의 채널로 구성된 이미지를 입력받아 0~9에 대응되는 출력값을 가진다.
class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        
        self.conv1 = nn.Conv2d(1, 32, 3, 1)
        self.conv2 = nn.Conv2d(32, 64, 3, 1)
        
        self.dropout1 = nn.Dropout2d(0.25)
        self.dropout2 = nn.Dropout2d(0.5)
        
        self.fc1 = nn.Linear(9216, 128)
        self.fc2 = nn.Linear(128, 10)

my_nn = Net()

3. 데이터가 모델의 레이어를 거치는 방식을 명시

  • PyTorch를 사용해 모델을 구성할 때, forward 함수를 정의하여 데이터가 연산 그래프(computation graph)를 통과하는 방식을 명시한다.
    • 참고) 입력 데이터가 출력으로 이어지는 흐름을 feed-forward라고 한다.
class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = nn.Conv2d(1, 32, 3, 1)
        self.conv2 = nn.Conv2d(32, 64, 3, 1)
        self.dropout1 = nn.Dropout2d(0.25)
        self.dropout2 = nn.Dropout2d(0.5)
        self.fc1 = nn.Linear(9216, 128)
        self.fc2 = nn.Linear(128, 10)

    def forward(self, x):
        x = self.conv1(x)
        x = F.relu(x)
        
        x = self.conv2(x)
        x = F.relu(x)
        
        x = F.max_pool2d(x)
        x = self.dropout1(x)
        
        x = torch.flatten(x, 1)
        x = self.fc1(x)
        x = F.relu(x)
        x = self.dropout2(x)
        x = self.fc2(x)
        
        output = F.log_softmax(x, dim=1)
        return output

4. (선택적으로) 테스트를 위해 임의의 데이터를 모델에 입력

  • 원하는 형식으로 데이터가 출력되는 지를 확인하기 위하여, 무작위로 생성된 데이터를 모델에 입력해본다.
random_data = torch.rand((1, 1, 28, 28))

my_nn = Net()
result = my_nn(random_data)
print(result)
  • 출력된 결과 텐서는 0~9 사이의 레이블에 대한 확률을 각각 가지고 있다.

댓글