복잡한 그래프도 세 단계로 만든다
Functional API의 기본 절차는 그래프가 커져도 바뀌지 않아.
- 입력 정의 —
keras.Input(shape=...)으로 모양과 자료형만 가진 기호 텐서를 만들어. 아직 실제 데이터는 없어. - 레이어 연결 —
x = Layer()(x)를 호출할 때마다 그래프에 연결 하나가 기록돼. - 모델 생성 —
keras.Model(inputs, outputs)를 호출하면 Keras가 출력에서 입력까지 거슬러 올라가 DAG를 확정해.
두 쌍의 괄호가 하는 일은 달라
layers.Dense(64, activation="relu")는 레이어 객체를 만들고, 이어지는 (inputs)는 그 레이어를 텐서에 적용해. 앞 괄호는 설정과 가중치를 가진 객체를 만들고 뒤 괄호는 그래프에 연결한 뒤 새 기호 텐서를 돌려줘.
생성과 호출이 나뉘어 있으므로 같은 레이어 인스턴스를 여러 번 호출할 수 있어. dense = Dense(64)를 만든 뒤 dense(x1)과 dense(x2)를 호출하면 두 경로가 같은 가중치를 공유해. 레이어 공유와 weight tying은 이 성질에서 나와. 이때 실제 데이터로 순전파를 실행하는 것이 아니라 계산 그래프를 설명하고 있으므로 결과를 직렬화할 수 있어.