nn.Linear(입력, 출력) — 같은 계산을 한 줄로 ★★★
W와 B를 매번 직접 만들고 x @ W.T + B를 쓰는 건 번거로워요. 그래서 PyTorch가 이 일을 해 주는 부품을 미리 만들어 뒀어요. 그게 nn.Linear예요. Linear는 "선형(일차식) 계산"이라는 뜻이에요.
nn.Linear(in_features, out_features) = 입력 특성 개수, 출력 특성 개수를 넣으면 W와 B를 자동으로 만들고, 호출하면 x @ W.T + B를 계산해 주는 층이에요.
| 코드 줄 | 무슨 뜻 |
|---|---|
nn.Linear(3, 2) | 앞 숫자가 입력, 뒤 숫자가 출력이에요. 입력 3개를 출력 2개로 바꿔요. |
fc.weight.shape | 자동으로 만들어진 가중치. 크기는 (출력, 입력) = (2, 3)이에요. 괄호 안 순서와 반대라서 헷갈리기 쉬워요. |
fc.bias.shape | 편향. 크기는 (출력,) = (2,)예요. |
fc(x) | 층도 함수처럼 부를 수 있어요. 결과 크기는 (4, 2)예요. |
입력 3개가 출력 2개와 모두 선으로 이어져요. 이 선 하나하나가 가중치이고, 출력 칸마다 편향이 하나씩 붙어요. 그래서 학습할 숫자(파라미터) 개수 = 입력 × 출력 + 출력이에요.
| 층 | 계산 | 파라미터 개수 |
|---|---|---|
nn.Linear(3, 2) | 3×2 + 2 | 8개 |
nn.Linear(8, 4) | 8×4 + 4 | 36개 |
nn.Linear(4, 6) | 4×6 + 6 | 30개 |
nn.Linear(6, 2) | 6×2 + 2 | 14개 |
이제 nn.Linear를 모델 클래스 안에 넣어 볼게요. 교수님이 수업에서 쓴 형태이고, 샘플 시험 3번도 이 모양이에요.
| 코드 줄 | 무슨 뜻 |
|---|---|
self.fc = nn.Linear(3, 2) | 층 하나를 만들어 self.fc라는 이름으로 모델에 붙여요. 이렇게 붙이면 모델이 자동으로 기억해요. |
return self.fc(x) | x를 층에 넣은 결과를 돌려줘요. 괄호와 x를 꼭 써야 계산이 실행돼요. |
model.named_parameters() | 학습할 숫자들을 이름과 함께 보여줘요. 이름은 fc.weight, fc.bias예요. |
3주차의 직접 만든 방식과 4주차의 nn.Linear 방식을 비교하면 이래요.
| 구분 | 직접 만들기 | nn.Linear 쓰기 |
|---|---|---|
| 만들기 | self.W, self.B | self.fc = nn.Linear(3, 2) |
| 계산 | x @ self.W.T + self.B | self.fc(x) |
| 값 접근 | model.W, model.B | model.fc.weight, model.fc.bias |
| 등록된 이름 | W, B | fc.weight, fc.bias |
nn.Linear(입력, 출력)은 말하는 순서 그대로 써요("3개를 2개로"). 하지만 안에 든 weight는 (출력, 입력)이라 반대로 저장돼요. 문제에서 nn.Linear(2, 3)처럼 순서가 뒤집힌 보기는 오답이에요.
① 문제 설명에서 "입력 특성 몇 개 → 출력 특성 몇 개"를 찾아요. ② 그 순서대로 nn.Linear(입력, 출력)을 골라요. ③ 입력의 첫 숫자(torch.ones(4, 3)의 4)는 배치 크기라서 Linear 숫자와 상관없어요. 4와 3을 헷갈려 nn.Linear(4, 2)를 고르면 틀려요.
잠깐 확인 — nn.Linear(10, 5)의 weight 크기와 파라미터 개수는?
weight는 (5, 10)이고 bias는 (5,)예요. 파라미터는 10×5 + 5 = 55개예요.
자료: 3·6주차 · Week03_Class_for_PyTorch(업데이트), Week04_Autograd_Loss_Optimizer · 6주차 녹취(빅데이터06), 7주차 녹취(빅데이터07)