시험 샘플 3번 풀기 — 빈칸 (A), (B)와 호출 과정 ★★★
조건은 "입력 특성 3개를 출력 특성 2개로 변환"하고 입력 x가 (4, 3), 출력이 (4, 2)예요.
- (A) — 입력 특성 3개, 출력 특성 2개이니
nn.Linear(3, 2). 순서는 (입력, 출력)이에요. x의 마지막 차원 3이 입력 특성이에요. 맨 앞의 4는 batch 크기라서 Linear에 안 들어가요. - (B) — 저장한 층에 x를 통과시키는
self.fc(x). 괄호로 호출해야 계산 결과(Tensor)를 돌려줘요.self.fc만 쓰면 층 객체 자체를 돌려줄 뿐이에요. - 호출 과정 — 상속받은
__call__()의 처리를 거쳐forward()가 실행돼요.__init__()은 객체를 만들 때 한 번만 실행되고 model(x)할 때는 다시 실행되지 않아요.
| 선택지 | (A), (B) | 판정과 이유 |
|---|---|---|
| ① | nn.Linear(2, 3), self.fc(x) | 틀림. 입력 2개 → 출력 3개라서 문제 조건(3 → 2)과 반대예요 |
| ② | nn.Linear(3, 2), self.fc(x), __init__ 재실행 | 틀림. (A), (B)는 맞지만 호출 과정이 틀려요. model(x)는 __init__을 다시 실행하지 않아요 |
| ③ | nn.Linear(3, 2), self.fc, __call__ → forward | 틀림. (B)에 괄호가 없어서 x가 계산에 쓰이지 않아요 |
| ④ | nn.Linear(4, 2), self.fc(x), __init__ 재실행 | 틀림. 4는 batch 크기라서 입력 특성이 아니에요. 호출 과정도 틀려요 |
| ⑤ | nn.Linear(3, 2), self.fc(x) | 맞음 (정답). 호출 과정은 "상속받은 __call__()의 처리를 거쳐 forward() 실행" |
선택지가 (A), (B), 호출 과정 세 부분으로 나뉘어 있어서 한 군데라도 틀리면 오답이에요. 위 표처럼 세 칸을 따로 확인하면 돼요.
이 모델에서 자주 하는 실수 세 가지도 알아 두세요(수업 자료의 "자주 발생하는 오류").
| 실수 | 결과 |
|---|---|
super().__init__()을 부르지 않음 | nn.Module 내부 준비가 안 돼서 layer를 등록할 때 에러가 나요 |
forward()를 정의하지 않음 | model(x)가 실행할 계산이 없어 NotImplementedError |
| Linear의 입력 특성 수와 입력의 마지막 차원이 다름 | shape이 안 맞는다는 에러. 예를 들어 nn.Linear(4, 3)에는 마지막 차원이 4인 Tensor를 넣어야 해요 |
모델 코드의 뼈대는 ① 부모(nn.Module) 상속 → ② __init__ 맨 앞에 super().__init__() → ③ self.층 = nn.Linear(입력, 출력) → ④ forward에서 self.층(x) → ⑤ 사용은 model(x)예요. 이 다섯 줄을 외워 두면 시험 3번은 풀려요.
nn.Module을 상속한 모델은 __init__()에서 super().__init__()을 먼저 호출한 뒤 layer를 정의·등록하고, forward()에서 입력으로부터 출력까지의 계산 흐름을 정의한다. model(x)는 부모의 __call__()을 거쳐 forward()를 실행하므로 forward()를 직접 호출하지 않는다. nn.Linear(in, out)은 입력의 마지막 차원 in을 out으로 바꾼다. 빈칸 문제는 "(입력, 출력) 순서", "괄호로 호출", "__init__은 다시 실행되지 않음"을 차례로 확인하세요.
잠깐 확인 — (A)를 nn.Linear(4, 2)로 쓰면 y = model(x)에서 어떻게 되나요? (x는 (4, 3))
에러가 나요. Linear는 입력의 마지막 차원이 4일 것으로 기대하는데 x의 마지막 차원은 3이라서 shape이 맞지 않아요.
자료: 3~4주차 · Week03_Class_for_PyTorch(pdf, ipynb 업데이트본) · 빅데이터03(3주차)·빅데이터04(4주차) 녹취