call() 안에 조건문이 필요하거나 입력 모양이 동적으로 바뀌고 학습 단계까지 직접 정의해야 한다면 keras.Model이나 keras.layers.Layer를 상속해. 정적 그래프로 표현할 수 없는 계산을 Python으로 작성하는 탈출구야. 대신 model.summary()와 plot_model이 내부 구조를 보는 능력은 약해져.
정적 그래프를 Python 코드로 바꾼다
Sequential과 Functional API는 데이터가 들어오기 전에 모든 레이어 연결이 정해진 그래프를 만들어. 그래서 Keras가 실행 없이도 모양을 추론하고 model.summary()와 plot_model()을 제공할 수 있어. Subclassing에서는 call()을 평범한 Python 메서드로 작성하므로 순전파가 코드의 실제 실행 결과가 돼. 정적 그래프가 담을 수 없는 제어 흐름도 표현할 수 있지.
다음과 같은 경우에 필요해.
- 입력값에 따라 경로가 바뀌는 트리형 신경망이나 mixture-of-experts 라우팅
if,else, 횟수가 달라지는 반복문 같은 실제 Python 제어 흐름- 연구 중 구조가 자주 바뀌어 그래프를 다시 연결하기보다 로직을 고치는 편이 나을 때
- 순환 상태 기계나 사용자 정의 자기회귀 디코딩처럼 계산 자체가 고정 DAG가 아닐 때
자유의 비용을 필요한 곳에만 내
Subclass 모델은 설정 딕셔너리만으로 복원하기 어렵고, 실제 데이터로 한 번 호출하기 전에는 전체 그래프를 볼 수 없어. 중간 활성값을 꺼내는 일도 Functional 모델보다 번거롭지. 어느 API가 더 우월한지가 아니라 모델에서 Python이 꼭 필요한 범위가 얼마나 되는지를 판단해야 해.
가장 좋은 기본 패턴은 동적인 부분만 Layer로 상속하고 나머지 정적 구조를 Functional API로 잇는 거야. 구조 분석의 손실을 필요한 블록 안에만 가두고 모델의 나머지는 계속 살펴볼 수 있어.