The Functional API

The Functional API

모델을 만들 때 Sequential 방식만으로는 다루기 어려운 구조가 있어요. 다중 입력·다중 출력, 레이어 공유, 잔차 연결 같은 비선형 토폴로지가 필요하면 Keras의 Functional API를 쓰는 게 정답이에요. Functional API는 keras.Sequential보다 훨씬 유연해서, 복잡한 모델 구조를 표현하면서도 비교적 고수준이고 안전한 방식으로 구성할 수 있어요.

출처: The Functional API · Keras Guides

소개

Keras의 functional APIkeras.Sequential API보다 더 유연한 모델을 만드는 방식이에요. 비선형 토폴로지, 공유 레이어, 심지어 다중 입력·다중 출력까지 처리할 수 있죠.

기본적인 3개 레이어 그래프를 functional API로 만들려면 입력 노드부터 시작해요.

inputs = keras.Input(shape=(784,))

데이터의 shape가 784차원 벡터로 설정돼요. 배치 크기는 각 샘플의 shape만 지정하므로 항상 생략돼요.

학습·평가·추론

Functional API로 만든 모델의 학습·평가·추론은 Sequential 모델과 완전히 동일하게 동작해요. Model 클래스는 내장 학습 루프(fit())와 내장 평가 루프(evaluate())를 제공해요. 이 루프들은 커스터마이즈해서 자신만의 학습 루틴을 만들 수도 있어요.

저장과 직렬화

Functional 모델의 저장·직렬화도 Sequential 모델과 동일해요. 표준 방식은 model.save()를 호출해 전체 모델을 하나의 파일로 저장하는 거예요. 나중에 같은 모델을 다시 재현할 수 있어요.

저장된 파일에는 다음이 포함돼요.

  • 모델 아키텍처
  • 학습 중 학습된 모델 가중치 값
  • compile()에 넘긴 학습 구성(있을 경우)
  • 옵티마이저와 그 상태(중단한 지점부터 재시작할 경우)
model.save("my_model.keras")
del model
# Recreate the exact same model purely from the file:
model = keras.models.load_model("my_model.keras")

모델 직렬화·저장에 대한 자세한 내용은 모델 저장 가이드를 참고해요.

같은 레이어 그래프로 여러 모델 정의하기

아래 예시에서는 같은 레이어 스택으로 두 모델을 만든다. 이미지 입력을 16차원 벡터로 바꾸는 encoder 모델과, 학습용 end-to-end autoencoder 모델이에요. 입력에 encoder, decoder를 연결해 두 모델을 동시에 정의할 수 있죠.

모든 모델은 레이어처럼 호출 가능하다

Functional API의 또 다른 장점은 레이어와 모델을 함수처럼 연결한다는 점이에요. 그래프의 중간 지점에서 model(input)처럼 호출해 부분 모델을 추출할 수 있어요.

복잡한 그래프 토폴로지 다루기

장난감 ResNet 모델

레지듀얼 연결이 있는 토이 ResNet도 functional API로 표현할 수 있어요. 레이어의 출력을 Add 레이어로 더해 잔차 연결을 만들면 돼요.

공유 레이어

같은 레이어를 여러 입력에 적용해 가중치를 공유할 수 있어요. 두 텍스트 시퀀스를 같은 Embedding 레이어로 처리하는 시나리오처럼, 서로 다른 입력이 같은 가중치를 쓰게 하려면 레이어를 한 번 만들어 두 입력에 각각 호출하면 돼요.

Functional API를 써야 할 때

새 모델을 만들 때 functional API를 쓸지, Model 클래스를 직접 서브클래싱할지 고민이 될 수 있어요. 일반적으로 functional API가 더 고수준이고 쉽고 안전하며, 서브클래싱 모델이 지원하지 않는 여러 기능을 갖고 있어요.

API 스타일 섞어 쓰기

레이어를 서브클래싱해 직접 구현하는 경우, call(self, inputs, **kwargs) 메서드를 정의해야 해요. 학습·추론 모드를 구분하려면 training 인자를, RNN 같은 곳에선 mask 인자를 받을 수 있어요. 필요에 따라 trainingmask를 함께 쓰는 것도 가능하죠.

더 알아보기