본문 바로가기
C.W.K.
Stream
Lesson 04 of 07 · published

call() 메서드

~8 min · subclass

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

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]처럼 표현하고 백엔드 전용 연산은 피해야 해.

Code

학습할 때만 분기하는 call()·python
class ConditionalLayer(keras.layers.Layer):
    def call(self, inputs, training=False):
        # Use keras.ops for backend-agnostic code!
        x = keras.ops.relu(inputs)
        if training:
            x = keras.ops.nn.dropout(x, rate=0.5)
        return x

External links

Exercise

학습할 때만 Dropout(0.5)을 적용하는 Layer를 작성해. layer(x, training=True)와 layer(x, training=False)를 호출해 출력이 달라지는지 확인해.

Progress

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

댓글 0

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

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