층 쌓기 — ReLU, nn.Sequential, 다층 모델
실제 모델은 층을 여러 개 이어 붙여요. 첫 층의 출력이 다음 층의 입력이 되는 구조예요. 층 사이에는 보통 ReLU를 끼워 넣어요.
숫자별로 0보다 작으면 0으로, 0 이상이면 그대로 바꾸는 계산이에요. 크기(shape)는 변하지 않아요. 예를 들어 [-2, 0, 3]은 [0, 0, 3]이 돼요. 학습할 숫자가 없어서 파라미터도 없어요.
참고로, 층 사이에 ReLU 같은 계산이 없으면 선형 계산을 여러 번 해도 결국 선형 계산 한 번과 같아져요. 그래서 층을 쌓을 때 ReLU를 끼워 넣어요.
층을 순서대로 이어 붙이기만 하면 되는 모델은 nn.Sequential(차례대로 쌓기)로 간단히 만들 수 있어요. 클래스를 따로 만들 필요가 없어요.
| 코드 줄 | 무슨 뜻 |
|---|---|
nn.Linear(4, 5) | 첫 번째 층. 특성 4개를 5개로 바꿔요. (4, 4) → (4, 5) |
nn.ReLU() | 음수를 0으로. 크기는 그대로 (4, 5) |
nn.Linear(5, 2) | 두 번째 층. 앞 층 출력 5개를 받아 2개로 바꿔요. (4, 5) → (4, 2) |
0.weight, 2.weight | 이름은 층 번호예요. 1번인 ReLU는 파라미터가 없어서 이름에 안 나와요. |
파라미터 개수는 (4×5+5) + (5×2+2) = 25 + 12 = 37개예요. 층을 이을 때는 앞 층의 출력 개수 = 다음 층의 입력 개수여야 해요. 5와 5가 맞았죠.
그렇다면 직접 클래스를 만드는 모델은 언제 필요할까요? 교수님 자료에 정리돼 있어요. 계산 흐름이 갈라지거나 합쳐질 때예요.
| 상황 | 예시 |
|---|---|
| 여러 경로 결과를 합칠 때 | fc1(x) + fc2(x) |
| 입력을 중간 결과에 더할 때(잔차 연결) | x + layer(x) |
| 입력이 여러 개일 때 | 이미지와 숫자 데이터를 함께 입력 |
| 결과를 여러 개 돌려줄 때 | 예측값과 중간 특징을 함께 반환 |
| 조건문이나 반복문이 필요할 때 | 조건에 따라 다른 층 실행 |
같은 입력 x가 두 길로 갈라져 갔다가 결과를 더해요. 한 줄로만 이어지는 Sequential로는 표현할 수 없어요. 파라미터는 층 2개라서 (3×2+2) × 2 = 16개예요.
교수님이 낸 과제 1은 이 생각을 늘린 것이에요. 입력 (10, 8)이 8 → 4 → 6 → 2 순서로 지나가요. 각 층 사이에 ReLU를 쓰되 마지막 출력에는 ReLU를 쓰지 않아요. 파라미터는 36 + 30 + 14 = 80개예요. forward에서는 x = ...처럼 같은 변수 x를 계속 덮어쓰는 것이 관례예요.

다층 모델 문제는 출력 크기를 층마다 손으로 따라가면 풀려요. 예를 들어 입력 (4, 3)에 nn.Linear(3, 5) → ReLU → nn.Linear(5, 2)이면 (4, 3) → (4, 5) → (4, 5) → (4, 2)예요. 앞 층 출력 개수와 다음 층 입력 개수가 다르면 오류예요.
잠깐 확인 — nn.Sequential(nn.Linear(4, 5), nn.ReLU(), nn.Linear(5, 2))에서 ReLU의 이름 번호가 왜 안 나올까요?
ReLU에는 학습할 파라미터가 없기 때문이에요. 0.weight, 0.bias, 2.weight, 2.bias만 나오고 번호 1은 건너뛰어요.
자료: 3·6주차 · Week03_Class_for_PyTorch(업데이트), Week04_Autograd_Loss_Optimizer · 6주차 녹취(빅데이터06), 7주차 녹취(빅데이터07)