진짜 일꾼은 layer
Layer 를 subclass 하는 게 Model 통째로 subclass 하는 것보다 훨씬 흔해 — 권장되는 building block 이거든. custom layer 는 Sequential, Functional, 또는 다른 subclass model 안에 군말 없이 끼워지니까. 알아둘 메서드는 셋: __init__() 은 config 저장 (units 몇 개, activation 뭐), build() 는 weight 생성, call() 은 forward (Code block 참고).
weight 가 왜 __init__() 말고 build() 에 사나
재밌는 건 build(input_shape) 야. weight 를 __init__() 에서 만들 *수도* 있어, 근데 그러면 입력의 feature 차원을 미리 알고 하드코딩해야 해 — layer 를 다른 데서 재사용하는 순간 깨져. build() 가 Keras 의 답이야: layer 가 실제 데이터를 처음 보는 순간 자동 실행되고, 구체적인 input_shape 를 받아서 input_shape[-1] 로 weight 행렬 크기를 정해. 이게 *lazy weight creation* 이고, 그래서 MyDense(64) 라고만 써도 들어오는 입력에 맞춰 적응해. weight 는 add_weight() 로 등록하는데, 이게 Keras 가 그걸 trainable variable 로 추적하게 만드는 지점이야.
get_config() 가 serialization 의 고리를 닫아 — 생성자 인자를 평범한 dict 로 돌려줘서 Keras 가 저장된 파일에서 layer 를 복원할 수 있게 해. 빼먹으면 custom layer 가 model.save() / load_model() 를 왕복 못 해.