모델은 데이터가 지나가는 길입니다
PyTorch에서 신경망 모델은 보통 nn.Module을 상속해서 만듭니다. 기본 패턴은 단순합니다. __init__에서는 모델에 필요한 계층을 준비하고, forward에서는 입력 데이터가 그 계층들을 어떤 순서로 지나갈지 정의합니다.
즉, __init__은 부품을 만드는 곳이고, forward는 부품을 연결해 예측 흐름을 만드는 곳입니다.
import torch
from torch import nn
class FashionMNISTModel(nn.Module):
def __init__(self):
super().__init__()
self.flatten = nn.Flatten()
self.network = nn.Sequential(
nn.Linear(28 * 28, 128),
nn.ReLU(),
nn.Linear(128, 64),
nn.ReLU(),
nn.Linear(64, 10)
)
def forward(self, x):
x = self.flatten(x)
logits = self.network(x)
return logitsFashionMNIST 이미지는 보통 [1, 28, 28] 모양입니다. 흑백 이미지 1장에 세로 28, 가로 28 픽셀이 있다는 뜻입니다. nn.Flatten()은 이 이미지를 28 * 28 = 784개의 숫자로 펼칩니다. 그다음 nn.Linear 계층을 지나며 분류에 필요한 특징을 계산합니다.
마지막 nn.Linear(64, 10)의 출력 크기가 10인 이유는 FashionMNIST에 10개의 클래스가 있기 때문입니다. 여기서 나오는 값은 확률이 아니라 각 클래스에 대한 점수입니다. 이런 원시 점수를 보통 logits라고 부릅니다.

Sequential로 계층을 묶기
nn.Sequential은 여러 계층을 순서대로 실행하는 도구입니다. 위 코드에서는 Linear → ReLU → Linear → ReLU → Linear 순서로 데이터가 흐릅니다.
nn.Linear는 입력 숫자들을 조합해 새로운 출력 숫자를 만듭니다. 이 과정에서 학습 가능한 가중치와 편향을 사용합니다. nn.ReLU는 음수 값을 0으로 바꾸는 활성화 함수입니다. 활성화 함수가 있어야 모델이 단순한 직선 계산을 넘어 더 복잡한 패턴을 배울 수 있습니다.
이 모델은 합성곱 신경망은 아니지만, 초보자가 nn.Module의 구조를 익히기에 좋은 완전연결 신경망입니다.
모델 인스턴스 만들고 구조 확인하기
클래스를 정의했다면 실제 모델 객체를 만들어야 합니다.
model = FashionMNISTModel()
print(model)출력 결과를 보면 모델 안에 어떤 계층이 들어 있는지 확인할 수 있습니다. 처음에는 print(model)을 자주 사용하세요. 내가 생각한 구조와 실제 모델 구조가 같은지 확인하는 습관이 중요합니다.
입력 배치를 하나 만들어 모델에 넣어 볼 수도 있습니다.
x = torch.randn(32, 1, 28, 28)
y = model(x)
print(y.shape)출력 모양은 보통 다음과 같습니다.
torch.Size([32, 10])32는 배치 크기입니다. 한 번에 32장의 이미지를 넣었다는 뜻입니다. 10은 각 이미지마다 10개 클래스 점수가 나왔다는 뜻입니다.
forward는 직접 부르지 않습니다
모델 안에는 forward 메서드가 있지만, 보통 다음처럼 직접 호출하지 않습니다.
# 권장하지 않는 방식
output = model.forward(x)대신 이렇게 씁니다.
output = model(x)model(x)를 실행하면 PyTorch가 내부적으로 forward(x)를 호출합니다. 이 방식은 단순히 보기 좋은 관례만은 아닙니다. PyTorch는 model(x) 호출 과정에서 학습에 필요한 여러 내부 처리를 함께 관리합니다. 그래서 특별한 이유가 없다면 항상 model(x) 형태를 사용합니다.
학습 가능한 파라미터 확인하기
모델이 학습한다는 것은 내부의 가중치와 편향 값이 바뀐다는 뜻입니다. 이 값들을 파라미터라고 부릅니다.
for param in model.parameters():
print(param.shape)이렇게 하면 학습 가능한 텐서들의 모양을 볼 수 있습니다. 이름까지 함께 보고 싶다면 named_parameters()를 사용합니다.
for name, param in model.named_parameters():
print(name, param.shape, param.requires_grad)requires_grad가 True이면 autograd가 이 파라미터의 기울기를 계산한다는 뜻입니다. 나중에 옵티마이저는 이 파라미터들과 기울기를 이용해 값을 조금씩 업데이트합니다.
보통 옵티마이저를 만들 때도 다음처럼 model.parameters()를 넘깁니다.
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)이번 장의 핵심은 모델을 직접 정의하는 기본 구조입니다. nn.Module을 상속하고, __init__에서 계층을 만들고, forward에서 데이터 흐름을 작성합니다. 이 패턴을 이해하면 PyTorch 모델 코드를 읽고 직접 수정할 수 있는 출발점에 서게 됩니다.
이 노트는 보도·비평·교육·연구 목적으로 작성되었습니다. 저작권 문의가 있으시면 에서 알려주세요.