더북(TheBook)

SimpleDense 클래스에서는 NavieDense처럼 생성자에서 가중치를 만들지 않습니다. 그 대신 상태 생성을 위한 전용 메서드인 build()에서 만듭니다. 이 메서드는 층이 처음 본 입력 크기를 매개변수로 받습니다. build() 메서드는 층이 처음 호출될 때 (__call__() 메서드를 통해) 자동으로 호출됩니다. 사실 이것이 __call__() 메서드가 아니라 별도의 call() 메서드에서 계산을 정의한 이유입니다. 기본 Layer 클래스의 __call__() 메서드는 다음과 같습니다.

def __call__(self, inputs):
    if not self.built:
         self.build(inputs.shape)
         self.built = True
    return self.call(inputs)

자동으로 크기를 추론하면 이전 예시는 다음과 같이 간단하고 깔끔하게 표현할 수 있습니다.

model = keras.Sequential([
    SimpleDense(32, activation="relu"),
    SimpleDense(64, activation="relu"),
    SimpleDense(32, activation="relu"),
    SimpleDense(10, activation="softmax")
])

Layer 클래스의 __call__() 메서드가 자동 크기 추론만 처리하는 것은 아닙니다. 즉시 실행과
(7장에서 배우게 될 개념인) 그래프 실행(graph execution) 사이를 전환하고 (11장에서 다룰) 입력 마스킹(masking)을 처리하는 등 더 많은 작업을 관리합니다. 지금은 사용자 정의 층을 구현할 때 call() 메서드에 정방향 패스 계산을 넣는다는 것만 기억하세요.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.