728x90
반응형
torch.nn.Sequential 설명과 예시
torch.nn.Sequential
은 PyTorch에서 신경망 레이어를 순차적으로 연결하기 위한 컨테이너 모듈입니다. 복잡한 네트워크 구조를 간결하게 정의하고, 데이터가 레이어를 통과하는 순서를 명확하게 지정할 수 있습니다.
기본 개념
- 여러 레이어를 순서대로 연결하여 하나의 모듈로 관리
- 입력 데이터가 첫 번째 레이어부터 마지막 레이어까지 순차적으로 통과
- 각 레이어의 출력이 다음 레이어의 입력으로 자동 전달
- 모듈 전체를 하나의 함수처럼 호출 가능
간단한 예시 1: 기본 사용법
import torch
import torch.nn as nn
# Sequential을 사용하여 간단한 신경망 정의
model = nn.Sequential(
nn.Linear(10, 20), # 입력 차원: 10, 출력 차원: 20
nn.ReLU(), # 활성화 함수
nn.Linear(20, 15), # 입력 차원: 20, 출력 차원: 15
nn.ReLU(),
nn.Linear(15, 1) # 출력 레이어
)
# 입력 데이터 생성 (배치 크기: 5, 입력 차원: 10)
x = torch.randn(5, 10)
# 순전파 수행
output = model(x)
print(output.shape) # torch.Size([5, 1])
이 예시에서 데이터의 흐름은:
- 입력
x
: [5, 10] - 첫 번째 Linear: [5, 10] → [5, 20]
- ReLU: [5, 20] → [5, 20] (값만 변경)
- 두 번째 Linear: [5, 20] → [5, 15]
- ReLU: [5, 15] → [5, 15] (값만 변경)
- 세 번째 Linear: [5, 15] → [5, 1]
- 최종 출력: [5, 1]
예시 2: 명명된 레이어 사용
OrderedDict
를 사용하여 각 레이어에 이름을 부여할 수 있습니다:
from collections import OrderedDict
named_model = nn.Sequential(OrderedDict([
('fc1', nn.Linear(10, 20)),
('relu1', nn.ReLU()),
('fc2', nn.Linear(20, 15)),
('relu2', nn.ReLU()),
('fc3', nn.Linear(15, 1))
]))
# 레이어 접근
print(named_model.fc1) # Linear(in_features=10, out_features=20, bias=True)
# 동일하게 사용
output = named_model(x)
print(output.shape) # torch.Size([5, 1])
예시 3: 리스트의 레이어 사용
리스트에 레이어를 추가한 후 *
연산자로 풀어서 전달하는 방식:
layers = []
layers.append(nn.Linear(10, 20))
layers.append(nn.ReLU())
layers.append(nn.Linear(20, 15))
layers.append(nn.ReLU())
layers.append(nn.Linear(15, 1))
# *layers는 리스트의 원소들을 개별 인자로 풀어서 전달
list_model = nn.Sequential(*layers)
output = list_model(x)
print(output.shape) # torch.Size([5, 1])
이 방식은 MultiLayerPerceptron
클래스에서 사용된 방법과 동일합니다.
예시 4: 조건부 레이어 추가
조건에 따라 레이어를 추가하는 예:
def create_model(input_dim, hidden_dims, output_dim, use_batchnorm=True):
layers = []
# 첫 번째 레이어
layers.append(nn.Linear(input_dim, hidden_dims[0]))
# 조건부로 배치 정규화 추가
if use_batchnorm:
layers.append(nn.BatchNorm1d(hidden_dims[0]))
layers.append(nn.ReLU())
# 나머지 은닉층
for i in range(1, len(hidden_dims)):
layers.append(nn.Linear(hidden_dims[i-1], hidden_dims[i]))
if use_batchnorm:
layers.append(nn.BatchNorm1d(hidden_dims[i]))
layers.append(nn.ReLU())
# 출력 레이어
layers.append(nn.Linear(hidden_dims[-1], output_dim))
return nn.Sequential(*layers)
# 사용 예
model = create_model(10, [20, 15], 1, use_batchnorm=True)
print(model) # 모델 구조 출력
Sequential의 장점
- 간결함: 복잡한 forward 메서드 없이 네트워크 구조 정의 가능
- 가독성: 데이터 흐름이 명확하게 시각화됨
- 모듈성: 레이어 그룹을 쉽게 교체하거나 재사용 가능
- 편의성: 레이어 추가/삭제가 간단함
제한사항
- 단순 순차 구조만 가능: 분기, 스킵 연결 등 복잡한 구조는 직접 구현 필요
- 중간 출력 접근 제한: 중간 레이어 출력을 별도로 사용하기 어려움
복잡한 네트워크 구조(ResNet, U-Net 등)는 일반적으로 사용자 정의 Module
클래스로 구현하며, Sequential
은 간단한 선형 흐름을 가진 구성 요소에 주로 사용됩니다.
728x90
반응형
'Language-LAB > Pytorch' 카테고리의 다른 글
Hook 메커니즘 (0) | 2025.03.24 |
---|---|
PyTorch에서 모델이나 레이어 호출 (0) | 2025.03.24 |
offsets 메커니즘 (0) | 2025.03.23 |
torch.nn.Embedding (0) | 2025.03.23 |