PyTorch

PyTorch의 nn.Module과 nn.Sequential 개념

PyExplorer 2025. 4. 9. 21:04
728x90

PyTorch의 nn.Module과 nn.Sequential 개념

PyTorch는 신경망을 구축하기 위한 다양한 도구를 제공하며, 그중에서도 torch.nn.Moduletorch.nn.Sequential은 가장 중요한 클래스입니다. 본 글에서는 nn.Modulenn.Sequential의 개념을 설명하고, 실제 구현 예제를 통해 이들의 차이점을 이해하는 데 도움을 드리고자 합니다.

1. nn.Module이란?

1.1 기본 개념

nn.Module은 PyTorch에서 신경망을 구성하는 기본 단위로, 모든 신경망 모델은 nn.Module을 상속하여 정의됩니다. 이는 신경망의 계층(layer)과 연산(operation)을 정의하고, 매개변수(parameter)를 포함하는 컨테이너 역할을 합니다.

1.2 주요 기능

  • 신경망의 계층을 정의하고 구성할 수 있음
  • 학습 가능한 매개변수를 자동으로 관리함
  • 모델 저장 및 불러오기를 쉽게 처리할 수 있음
  • 재귀적으로 계층을 포함할 수 있음 (즉, nn.Module 내부에 또 다른 nn.Module을 포함 가능)

1.3 기본 사용법

다음은 nn.Module을 사용하여 간단한 신경망을 정의하는 예제입니다.

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

class SimpleNN(nn.Module):
    def __init__(self):
        super(SimpleNN, self).__init__()
        self.fc1 = nn.Linear(10, 5)
        self.fc2 = nn.Linear(5, 1)

    def forward(self, x):
        x = F.relu(self.fc1(x))
        x = self.fc2(x)
        return x

model = SimpleNN()
print(model)

위 코드에서는 nn.Module을 상속받아 SimpleNN이라는 간단한 신경망을 정의하였습니다. __init__ 메서드에서 신경망의 계층을 정의하고, forward 메서드에서 순전파 연산을 수행합니다.

2. nn.Sequential이란?

2.1 기본 개념

nn.Sequential은 신경망의 계층을 순차적으로 정의하는 데 사용되는 클래스입니다. nn.Module을 상속받은 여러 개의 계층을 순차적으로 연결하는 방식으로, 비교적 간단한 신경망을 빠르게 정의할 때 유용합니다.

2.2 주요 특징

  • 계층을 순차적으로 쌓아 올릴 수 있음
  • forward 메서드를 별도로 정의할 필요 없음
  • 간단한 모델을 구현하는 데 적합하지만, 복잡한 구조에서는 유연성이 부족할 수 있음

2.3 기본 사용법

다음은 nn.Sequential을 사용하여 위와 동일한 모델을 구현하는 예제입니다.

model = nn.Sequential(
    nn.Linear(10, 5),
    nn.ReLU(),
    nn.Linear(5, 1)
)
print(model)

이 코드에서는 nn.Module을 직접 상속받지 않고, nn.Sequential을 사용하여 계층을 순차적으로 연결했습니다. 이 방식은 신경망이 단순한 구조일 때 매우 직관적이고 간단하게 구현할 수 있는 장점이 있습니다.

3. nn.Module과 nn.Sequential의 차이점

특징 nn.Module nn.Sequential
계층 정의 방식 __init__forward 메서드를 직접 구현 계층을 리스트처럼 나열
유연성 높은 유연성, 복잡한 네트워크 구조 가능 단순한 모델 구성에 적합
계층 접근 정의된 변수명을 통해 접근 인덱스를 통해 접근
확장성 다양한 연산 및 조건문 사용 가능 정해진 순서대로 연산 수행

3.1 유연성 차이 예제

다음은 nn.Module을 사용하여 if-else 조건을 추가한 예제입니다.

class FlexibleNN(nn.Module):
    def __init__(self, use_relu=True):
        super(FlexibleNN, self).__init__()
        self.fc1 = nn.Linear(10, 5)
        self.fc2 = nn.Linear(5, 1)
        self.use_relu = use_relu

    def forward(self, x):
        x = self.fc1(x)
        if self.use_relu:
            x = F.relu(x)
        x = self.fc2(x)
        return x

이처럼 nn.Module을 활용하면 조건문을 사용하여 동적인 구조를 만들 수 있습니다. 하지만 nn.Sequential은 이러한 방식으로 제어문을 적용할 수 없습니다.

4. 언제 nn.Module과 nn.Sequential을 사용할까?

  • nn.Module: 복잡한 신경망 구조를 만들 때 적합하며, 조건문, 반복문, 여러 개의 병렬 연산이 필요한 경우 사용됩니다.
  • nn.Sequential: 간단한 순차적 모델을 빠르게 구현할 때 유용합니다.

5. 결론

PyTorch의 nn.Modulenn.Sequential은 각각의 장점과 단점이 있습니다. 간단한 모델을 만들 때는 nn.Sequential을 사용하면 코드가 간결해지지만, 복잡한 신경망을 설계할 때는 nn.Module을 사용하는 것이 더 적합합니다.

신경망을 설계할 때는 목표하는 모델의 복잡성을 고려하여 적절한 방법을 선택하는 것이 중요합니다. nn.Module을 사용하면 보다 유연한 모델을 설계할 수 있으며, nn.Sequential을 활용하면 간결하고 가독성이 높은 코드를 작성할 수 있습니다.

728x90