call()이 레이어의 동작을 정의해
레이어가 입력 텐서를 출력 텐서로 바꾸는 계산은 모두 call() 안에 있어. Keras는 필요할 때 두 가지 특별한 인자를 자동으로 전달해.
training은 학습과 추론을 구분하는 불리언 값이야. Dropout은training=True일 때만 일부 값을 끄고, BatchNormalization은 학습할 때 현재 배치 통계를, 추론할 때 누적 통계를 사용해. 이런 하위 레이어를 감싸면 값을 그대로 전달해야 해.mask는 시퀀스에서 실제 시점과 패딩을 구분하는 선택적 불리언 텐서야. Attention과 순환 레이어가 패딩 위치를 무시하도록 해.
Python 제어 흐름과 백엔드 이동성을 함께 지켜
call()은 평범한 메서드이므로 if training: 분기, 반복문, 입력 모양에 따른 계산을 넣을 수 있어. 이것이 Subclassing을 선택하는 이유야. 다만 텐서 연산은 keras.ops로 작성해야 같은 레이어가 TensorFlow, PyTorch, JAX에서 그대로 돌아가. 활성화는 keras.ops.relu(x), 동적 모양은 keras.ops.shape(x)[0]처럼 표현하고 백엔드 전용 연산은 피해야 해.