C.W.K.
Stream
Lesson 02 of 07 · published

Functional 패턴

~8 min · functional

Level 0Keras 도제
0 XP0/97 lessons0/20 achievements
0/120 XP to next level120 XP to go0% complete

매번 똑같은 3 단계

Functional API 패턴은 3 단계고, 한 번 손에 붙으면 graph 가 아무리 복잡해져도 안 바뀌어:

  1. 입력 정의keras.Input(shape=...). 이게 *symbolic tensor* 를 만들어. shape 과 dtype 은 들고 있지만 아직 데이터는 없는 placeholder.
  2. layer 체인x = Layer()(x). 호출 한 번이 graph 에 edge 하나 기록.
  3. model 생성keras.Model(inputs, outputs). Keras 가 outputs 에서 inputs 로 거꾸로 추적하면서 DAG 를 굳혀.

괄호가 두 일을 한다

이 API 가 자연스러워지는 단 하나의 깨달음: *모든 layer 가 callable*. layers.Dense(64, activation="relu") 가 layer 객체를 *만들고*, 뒤에 붙는 (inputs) 가 그걸 tensor 에 *호출* 해. 생성 = weight 할당, 호출 = graph 에 배선하고 새 symbolic tensor 반환. 괄호 두 쌍이 각각 다른 일을 하는 거야.

이 분리가 핵심 보상이야. 생성과 호출이 따로니까 layer 인스턴스를 변수에 담아두고 두 번 이상 호출할 수 있어 — 그리고 매 호출이 *같은* weight 를 재사용해. dense = Dense(64) 만들고 dense(x1)·dense(x2) 부르면 둘이 weight 공유. 이 한 가지 사실이 shared layer (다음 lesson) 와 weight tying 을 가능하게 만드는 전부야. 그리고 여기서 실제 데이터로 forward pass 가 도는 게 아니라는 점도 봐 — graph 를 *기술* 하는 거지 *실행* 하는 게 아니야. 그래서 결과가 serializable 한 거고.

Code

3 단계 Functional 패턴 (MNIST 분류기)·python
import keras
from keras import layers

# Step 1: Define input
inputs = keras.Input(shape=(784,))

# Step 2: Chain layers
x = layers.Dense(256, activation="relu")(inputs)
x = layers.Dropout(0.3)(x)
x = layers.Dense(128, activation="relu")(x)
outputs = layers.Dense(10, activation="softmax")(x)

# Step 3: Create model
model = keras.Model(inputs=inputs, outputs=outputs, name="my_classifier")
model.summary()

External links

Exercise

MNIST Sequential 모델을 Functional 로 변환. model.summary() 동일한지 확인. 그다음 공유 Dense layer 만들어 두 다른 입력에 적용 — 둘이 weight 공유하는지 len(model.weights) 로 확인.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.