모델은 클래스예요 — nn.Module 뼈대 ★★★
앞 장에서 클래스(설계도)와 상속(부모의 기능을 물려받기)을 배웠죠. PyTorch에서 모델을 만들 때는 부모 클래스 nn.Module을 물려받아서 나만의 모델 클래스를 만들어요. nn.Module에는 모델이 일하는 데 필요한 기본 기능이 이미 들어 있어요.
모델은 계산기 상자예요. 상자를 만들 때(__init__) 안에 쓸 부품(층)을 넣어 두고, 숫자가 들어오면(forward) 어떤 순서로 계산해서 결과를 내보낼지 적어 둬요. 교수님 자료도 __init__은 층과 구성 요소를 정의하고 등록하는 곳, forward는 입력에서 출력까지의 계산 흐름을 정의하는 곳이라고 정리했어요.
| 코드 줄 | 무슨 뜻 |
|---|---|
class MyModel(nn.Module): | "MyModel은 nn.Module의 자식이다." |
def __init__(self): | 모델을 처음 만들 때 한 번 실행되는 곳. 층을 만들어 두는 자리예요. |
super().__init__() | 부모(nn.Module)의 준비 작업을 실행해요. 층과 파라미터를 관리할 준비를 하는 거예요. |
def forward(self, x): | 입력 x에서 출력까지의 계산 흐름을 쓰는 곳. 이름은 꼭 forward여야 해요. |
return x | 계산 결과를 내보내요. |
왜 super().__init__()을 맨 앞에 쓸까요? 자식 클래스가 __init__을 직접 만들면 부모의 __init__은 자동으로 실행되지 않아요. 그래서 "부모 것도 실행해 줘"라고 직접 불러야 해요. 안 부르면 층을 붙이는 순간 오류가 나요.
모델 뼈대 3줄은 클래스 이름 뒤에 (nn.Module) / 첫 줄에 super().__init__() / 계산은 forward예요.
모델 코드가 나오면 먼저 세 가지를 확인하세요. ① (nn.Module)을 물려받았는지 ② __init__ 맨 앞에 super().__init__()이 있는지 ③ 계산이 forward 안에 있는지. 보기에서 "층은 __init__에서 만들고 계산 흐름은 forward에서 정의한다"는 문장이 맞는 설명이에요.
잠깐 확인 — __init__ 안에서 super().__init__()을 빼먹고 self.fc = nn.Linear(3, 2)를 쓰면 어떻게 될까요?
오류가 나요. 직접 실행해 보면 "cannot assign module before Module.__init__() call"이라는 메시지가 나와요. 부모의 준비 작업이 끝나기 전에는 층을 붙일 수 없다는 뜻이에요.
자료: 3·6주차 · Week03_Class_for_PyTorch(업데이트), Week04_Autograd_Loss_Optimizer · 6주차 녹취(빅데이터06), 7주차 녹취(빅데이터07)