시험공부빅데이터분석
← 보드nn.Module로 모델 만들기 · 6/8

층 쌓기 — ReLU, nn.Sequential, 다층 모델

실제 모델은 층을 여러 개 이어 붙여요. 첫 층의 출력이 다음 층의 입력이 되는 구조예요. 층 사이에는 보통 ReLU를 끼워 넣어요.

ReLU

숫자별로 0보다 작으면 0으로, 0 이상이면 그대로 바꾸는 계산이에요. 크기(shape)는 변하지 않아요. 예를 들어 [-2, 0, 3]은 [0, 0, 3]이 돼요. 학습할 숫자가 없어서 파라미터도 없어요.

참고로, 층 사이에 ReLU 같은 계산이 없으면 선형 계산을 여러 번 해도 결국 선형 계산 한 번과 같아져요. 그래서 층을 쌓을 때 ReLU를 끼워 넣어요.

층을 순서대로 이어 붙이기만 하면 되는 모델은 nn.Sequential(차례대로 쌓기)로 간단히 만들 수 있어요. 클래스를 따로 만들 필요가 없어요.

seq = nn.Sequential( nn.Linear(4, 5), nn.ReLU(), nn.Linear(5, 2), ) x = torch.randn(4, 4) y = seq(x) print(tuple(y.shape)) for name, p in seq.named_parameters(): print(name, tuple(p.shape))
(4, 2) 0.weight (5, 4) 0.bias (5,) 2.weight (2, 5) 2.bias (2,)
코드 줄무슨 뜻
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)
입력이 여러 개일 때이미지와 숫자 데이터를 함께 입력
결과를 여러 개 돌려줄 때예측값과 중간 특징을 함께 반환
조건문이나 반복문이 필요할 때조건에 따라 다른 층 실행
class MyModel(nn.Module): def __init__(self): super().__init__() self.fc2 = nn.Linear(3, 2) self.fc1 = nn.Linear(3, 2) def forward(self, x): y1 = self.fc1(x) y2 = self.fc2(x) return y1 + y2 # Sequential로는 만들 수 없다

같은 입력 x가 두 길로 갈라져 갔다가 결과를 더해요. 한 줄로만 이어지는 Sequential로는 표현할 수 없어요. 파라미터는 층 2개라서 (3×2+2) × 2 = 16개예요.

교수님이 낸 과제 1은 이 생각을 늘린 것이에요. 입력 (10, 8)이 8 → 4 → 6 → 2 순서로 지나가요. 각 층 사이에 ReLU를 쓰되 마지막 출력에는 ReLU를 쓰지 않아요. 파라미터는 36 + 30 + 14 = 80개예요. forward에서는 x = ...처럼 같은 변수 x를 계속 덮어쓰는 것이 관례예요.

MyModel 골격
교수님 슬라이드 — nn.Module 모델의 기본 골격 (중요 표시)
이렇게 고르세요 (풀이 요령)

다층 모델 문제는 출력 크기를 층마다 손으로 따라가면 풀려요. 예를 들어 입력 (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번 손으로 풀기와 자주 나오는 오류 ★★★

자료: 3·6주차 · Week03_Class_for_PyTorch(업데이트), Week04_Autograd_Loss_Optimizer · 6주차 녹취(빅데이터06), 7주차 녹취(빅데이터07)