PyTorch는 동적 그래프(Dynamic Computational Graph)를 기반으로 하는 강력한 딥러닝 프레임워크입니다. 이번 포스팅에서는 torch.nn.Module을 활용하여 기본적인 신경망을 설계하고, torch.optim을 이용해 모델을 학습시키는 전 과정을 상세히 정리해 보겠습니다.

1. 신경망(Neural Network)의 기본 구조
신경망은 데이터를 입력받아 가중치 연산을 통해 결과를 예측하는 모델입니다. 핵심 구조는 다음과 같습니다.
- 입력층(Input Layer): 데이터가 처음 입력되는 층
- 은닉층(Hidden Layer): 특징을 추출하고 비선형 연산을 수행하는 층
- 출력층(Output Layer): 최종 결과(분류/회귀)를 내놓는 층
PyTorch에서는 nn.Module 클래스를 상속받아 이 구조를 정의하며, forward() 메서드에 데이터의 연산 흐름을 구현합니다.
2. PyTorch를 이용한 신경망 구현 (nn.Module)
먼저 필요한 라이브러리를 임포트하고, 간단한 신경망 클래스를 정의해 보겠습니다.
import torch
import torch.nn as nn
import torch.optim as optim
# 기본 신경망 클래스 정의
class SimpleNN(nn.Module):
def __init__(self):
super(SimpleNN, self).__init__()
# 입력(10차원) -> 은닉층(20차원)
self.fc1 = nn.Linear(10, 20)
# 활성화 함수: 모델에 비선형성 추가
self.relu = nn.ReLU()
# 은닉층(20차원) -> 출력(1차원)
self.fc2 = nn.Linear(20, 1)
def forward(self, x):
x = self.fc1(x)
x = self.relu(x)
x = self.fc2(x)
return x
# 모델 객체 생성
model = SimpleNN()
print(model)
💡 코드 포인트
- nn.Linear: 완전연결층(Fully Connected Layer)을 생성하는 함수입니다.
- nn.ReLU: 딥러닝 모델의 학습 성능을 높이기 위해 비선형성을 부여하는 활성화 함수입니다.
- forward(): 모델이 데이터를 입력받아 출력을 계산하는 순전파 과정을 정의합니다.
3. 손실 함수와 최적화 알고리즘 설정
학습의 목적은 예측값과 실제값의 차이(손실)를 최소화하는 것입니다. 이를 위해 손실 함수(Loss Function)와 최적화 기법(Optimizer)을 설정합니다.
# 1. 손실 함수 정의 (회귀 분석에 주로 사용하는 MSELoss)
criterion = nn.MSELoss()
# 2. 최적화 알고리즘 정의 (가장 대중적인 Adam 사용)
optimizer = optim.Adam(model.parameters(), lr=0.01)
- nn.MSELoss: 평균 제곱 오차를 계산합니다.
- optim.Adam: 경사 하강법의 개선된 형태로, 학습 속도와 안정성이 뛰어납니다. lr은 학습률(Learning Rate)을 의미합니다.
4. 5단계 신경망 학습 프로세스
이제 실제 데이터를 생성하고 모델을 학습시키는 과정을 살펴보겠습니다. PyTorch 학습 루프의 정석적인 5단계를 확인하세요.
# 가상의 데이터 생성 (100개의 샘플)
x_train = torch.rand(100, 10)
y_train = torch.rand(100, 1)
# 모델 학습 시작
num_epochs = 100
for epoch in range(num_epochs):
# 1. 기울기 초기화
optimizer.zero_grad()
# 2. 순전파 (Forward) 연산
outputs = model(x_train)
# 3. 손실 계산
loss = criterion(outputs, y_train)
# 4. 역전파 (Backward) 수행
loss.backward()
# 5. 가중치 업데이트
optimizer.step()
# 로그 출력
if (epoch+1) % 10 == 0:
print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item():.4f}')
⚠️ 개발자 노트: 주의할 점
학습 루프에서 optimizer.zero_grad()를 호출하지 않으면, 이전 루프의 기울기 값이 누적되어 엉뚱한 방향으로 학습될 수 있습니다. 매 에포크마다 반드시 초기화해주어야 합니다.
5. 모델 평가 및 예측
학습된 모델이 새로운 데이터에 대해 얼마나 잘 동작하는지 확인합니다.
# 테스트 데이터 생성
x_test = torch.rand(10, 10)
# 예측 수행 (Gradient 계산 중지 모드 권장)
with torch.no_grad():
y_pred = model(x_test)
print(y_pred)
6. 마무리하며
이번 포스팅에서는 PyTorch의 nn.Module을 활용한 기초적인 신경망 설계부터 학습 프로세스까지 알아보았습니다.
임베디드 시스템이나 에지(Edge) 환경에서 딥러닝 모델을 구동하기 위해서는 이와 같은 기본 구조에 대한 명확한 이해가 선행되어야 합니다.
'Python for AI, Embedded > Deep Learning: PyTorch & AI Modeling' 카테고리의 다른 글
| PyTorch 옵티마이저(Optimizer) 가이드: SGD와 Adam 차이점 및 실무 활용법 (0) | 2026.05.06 |
|---|---|
| PyTorch 활성화 함수와 손실 함수 완벽 가이드: Sigmoid부터 Cross-Entropy까지 (0) | 2026.05.05 |
| PyTorch nn.Module vs nn.Sequential 차이점 완벽 정리: 예제로 배우는 선택 기준 (0) | 2026.05.03 |
| PyTorch 데이터 증강(Augmentation) 완벽 가이드: 모델 성능을 높이는 전처리 기법 (0) | 2026.05.02 |
| PyTorch 데이터 로딩 파이프라인 구축: Dataset부터 DataLoader까지 (0) | 2026.05.01 |