모델에 건너뛰기 연결, 여러 입력과 출력, 공유 레이어가 들어오면 Sequential은 표현할 수 없지만 Functional API는 그래프로 그려낼 수 있어. ResNet, U-Net, 멀티모달 모델이 모두 이 방식으로 만들어져. output = layer(input)으로 흐름을 잇고 마지막에 keras.Model(inputs, outputs)로 묶는 것이 기본 문법이야.
실전 모델은 직선으로만 흐르지 않아
데이터는 갈라지고 다시 합쳐지며 앞 레이어를 건너뛰기도 해. Sequential에는 두 번째 입력을 받거나 residual add를 만들고, 나뉜 경로를 다시 concatenate하는 문법이 없어. 일렬 목록으로 표현할 수 없는 순간 Functional API가 필요해.
Functional API는 레이어 연결을 방향성 비순환 그래프(DAG)로 표현하므로 다음 구조를 만들 수 있어.
- 다중 입력 — 텍스트, 영상, 메타데이터를 합치기
- 다중 출력 — 클래스와 신뢰도를 함께 예측하기
- 건너뛰기 연결 — ResNet residual block처럼 레이어를 건너 연결하기
- 레이어 공유 — Siamese 모델처럼 같은 가중치를 여러 입력에 적용하기
- 모델 중첩 — 한 모델을 다른 모델 안에서 레이어처럼 호출하기
제품 모델의 기본 선택인 이유
ResNet, U-Net, Inception, Siamese, 멀티모달 모델처럼 현대의 주요 구조는 대부분 Functional API나 Subclassing으로 작성해. Functional API가 제품 코드에 특히 잘 맞는 까닭은 그래프를 직렬화할 수 있기 때문이야. Keras는 구조를 JSON으로 저장하고 그림으로 나타내며 소스 코드 없이도 복원할 수 있어. 반면 Model을 상속하면 Python 제어 흐름을 자유롭게 쓰는 대신 정적인 그래프의 장점을 일부 포기해. 구조가 고정된 DAG라면 Functional API를 쓰고, 실행할 때마다 Python 로직이 달라져야 할 때만 Subclassing을 선택해.