PyTorch의 nn.Module과 nn.Sequential 개념
PyTorch는 신경망을 구축하기 위한 다양한 도구를 제공하며, 그중에서도 torch.nn.Module
과 torch.nn.Sequential
은 가장 중요한 클래스입니다. 본 글에서는 nn.Module
과 nn.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.Module
과 nn.Sequential
은 각각의 장점과 단점이 있습니다. 간단한 모델을 만들 때는 nn.Sequential
을 사용하면 코드가 간결해지지만, 복잡한 신경망을 설계할 때는 nn.Module
을 사용하는 것이 더 적합합니다.
신경망을 설계할 때는 목표하는 모델의 복잡성을 고려하여 적절한 방법을 선택하는 것이 중요합니다. nn.Module
을 사용하면 보다 유연한 모델을 설계할 수 있으며, nn.Sequential
을 활용하면 간결하고 가독성이 높은 코드를 작성할 수 있습니다.
'PyTorch' 카테고리의 다른 글
PyTorch 활성화 함수와 손실 함수 (0) | 2025.04.11 |
---|---|
PyTorch 기본적인 신경망 구축 (0) | 2025.04.10 |
PyTorch 데이터 변환 및 Augmentation (0) | 2025.04.08 |
PyTorch 이미지 데이터 및 텍스트 데이터 로딩 (0) | 2025.04.07 |
PyTorch Dataset과 DataLoader 활용법 (0) | 2025.04.06 |