inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

딥러닝 CNN 완벽 가이드 - TFKeras 버전

Functional API 구조 이해하기 - 02

클래스 메서드 call을 __call__로 하면 왜 오류가 날까요?

991

ecomarine

작성한 질문수 20

0

파이썬 클래스의  'call' 메서드를 정의할때

' __call__'을 사용하는 것으로 알고 있는데, 

    def __call__:

            --code--

캐글 강의코드에서 __call__로 바꾸면 오류가 안나고

call을 하면 정상작동하는데 왜 이런건지 이런지 궁금합니다.

call 딥러닝 머신러닝 배워볼래요? kaggle tensorflow keras cnn

답변 1

1

권 철민

안녕하십니까

1. 캐글 강의코드에서 __call__로 바꾸면 오류가 안나고

call을 하면 정상작동하는데 왜 이런건지 이런지 궁금합니다.

=> keras Layer의 call()과 __call__()은 거의 유사하게 동작합니다.

keras Layer를 Callbable 객체로 만들면 보다 정확하게는 __call__()이 내부적으로 호출이 됩니다. 이 __call__()은 부모 Layer에 감춰져 있기에 작성해줄 필요가 없으며, __call__()이 해주는 것은 build()를 호출한 뒤에 call()을 호출하는 역할을 합니다.

Custom layer에 call()을 사용하지 않고 __call__()을 바로 적용할 수도 있습니다. 하지만 그렇게 하기 위해서는 build()에서 사용된 weight와 bias의 초기화를 한 뒤에 matrix 연산을 적용하고 tensor로 반환하는 로직을 만들어 줘야 합니다.

class CustomDense(tf.keras.layers.Layer):
    # CustomDense 객체 생성시 입력되는 초기화 parameter 처리
    def __init__(self, units=32):
        super(CustomDense, self).__init__()
        self.units = units

    
    def __call__(self, inputs):
        self.w = self.add_weight(
            shape=(inputs.shape[-1], self.units),
            initializer="random_normal",
            trainable=True,
        )
        self.b = self.add_weight(
            shape=(self.units,), initializer="random_normal", trainable=True
        )
        return tf.matmul(inputs, self.w) + self.b

# input 값을 4개의 원소를 가지는 1차원으로 생성.
inputs = Input((4,))
# 10개의 unit을 가지는 CustomDense 객체를 생성 후 callable로 inputs값 입력
outputs = CustomDense(10)(inputs)

# inputs와 outputs로 model 생성.
model = Model(inputs, outputs)
model.summary()

resize 질문

0

48

1

20251212 Kaggle 런타임에 scikit-learn 설치 실패 트러블 슈팅

0

75

1

Loss와 매트릭 관계

0

61

2

Boston 코랩 실습

0

161

2

배치 정규화의 이해와 적용 2 강의 질문

0

134

2

Augmentation원본에 적용해서 데이터 갯수 자체를 늘리는 행위는 의미가있나요?

0

143

2

Conv함수 안에 activation 을 넣지 않는 이유가 뭔지 궁금합니다.

0

201

2

소프트맥스 관련 질문입니다

0

208

1

강의 관련 질문입니다

0

151

2

residual block과 identity block의 차이

0

183

2

옵티마이저와 경사하강법의 차이가 궁금합니다.

1

236

1

실습 환경

0

165

2

입력 이미지 크기

0

242

2

데이터 증강

0

194

2

albumentations ShiftScaleRotate

0

205

1

Model Input Size 관련

0

279

1

마지막에 bird -> frog 말고도 deer -> frog 도 잘못된것 아닌가요??

0

203

1

일반적인 질문 (kaggle notebook사용)

0

271

2

실무에서 Augmentation 적용 시

0

336

2

안녕하세요 교수님

0

230

1

가중치 초기화(Weight Initialization) 질문입니다.

0

324

1

테스트 데이터셋 predict의 'NoneType' object has no attribute 'shape' 오류

0

405

1

학습이 이상하게 됩니다.

2

1032

2

boston import가 안됩니다

0

224

1