세 가지 컨테이너로 모듈을 조합해
PyTorch에서 모듈을 조합할 때 주로 쓰는 컨테이너는 세 가지야:
nn.Sequential(*modules): 모듈을 순서대로 실행하며 앞 모듈의 출력을 다음 모듈에 넘겨. 별도의forward()를 작성할 필요가 없어.nn.ModuleList([modules]): PyTorch가 추적할 수 있는 Python 목록이야.forward()를 직접 작성하고 원하는 방식으로 순회해.nn.ModuleDict({name: module}): 같은 개념을 사전 형태로 제공해. 다중 헤드 모델이나 분기 구조에 유용해.
'순서대로만 실행할 수 있으면 Sequential, 직접 흐름을 제어해야 하면 ModuleList'라는 기준이 코드의 약 80%에 잘 맞아. Sequential은 읽기 쉽고 print(model)에도 구조가 깔끔하게 보여. ModuleList는 분기, 건너뛰기 연결, 동적으로 정하는 깊이처럼 별도의 제어 흐름이 있을 때 사용해. 예를 들어 설정값 N으로 N계층 Transformer를 만들 때 적합해.
함정: 일반 Python 컬렉션은 쓰면 안 돼
계층을 일반 list나 dict에 저장하면 model.parameters()에 나타나지 않고, .to(device)로 이동하지 않으며, state_dict()에도 저장되지 않아. 더 위험한 건 오류가 나지 않는다는 점이야. 모델은 PyTorch가 볼 수 있는 계층만 학습해. 계층 컬렉션에는 항상 알맞은 nn.Module* 컨테이너를 사용해.