이미지는 캠프에서 제공된 이미지를 사용할 수 없으니, 내 사진을 쓰기로 했다 (。•̀ᴗ-)✧

grad_CAM을 얻기 위해서, output중 가장 높은 값을 갖는 값에 대해서 back-propagation을 진행한다.
1. 먼저 마지막 conv를 통과한 feature map을 얻기 위해, 마지막 conv 이후 batch_norm을 통과한 값을 얻기 위해 hook을 걸어 저장한다.

2. hook을 걸었으니, model을 추론한다. 추론하며 (1)에서 hook을 걸었기 때문에, 마지막 feature map이 저장된다!
3. 저장된 feature map의 gradient를 구하기 위해, "Tensor"에 hook을 건다. (아마 저장된 Tensor가 model안의 tensor와 동일한 것 같다. 그러니 back-propagate진행할 때 hook이 적용 되었으리라 생각한다. call-by-reference)
4. output에서 가장 높은 값을 갖는 값에 대해서 back-propagation을 진행한다.
These gradients flowing back are global-average-pooled 2 over the width and height dimensions (indexed by i and j respectively) t

이후 average pooling 진행한다.
dy/dA의 경우에는 save_grad에서 저장했기 때문에, 그저 AvgPool layer를 통과시켰다.
내 경우에는 dy/dA 는 (512,14,14) shape였고, width와 height를 avgpool하기 때문에, 결과는 (512,1,1)로 나왔다.
(512,1,1)과
A의 경우에는, (1)에서 구한 feature map으로, (512, 14, 14)를 가지고 있다.
(512, 1, 1)과 (512, 14, 14)를 k에 대해서 곱해야했다.


ReLU를 통과한 Grad-CAM을 Upsampling하여 모델의 입력이었던 내 얼굴과 합성해보면

다음과 같은 결과가 나온다!
'네이버 부스트캠프 AI Tech' 카테고리의 다른 글
12.15 주간 회고록 (1) | 2023.12.15 |
---|---|
RGB, GRAY에 관한 고찰 (0) | 2023.12.15 |
12.08 주간 회고록 (2) | 2023.12.08 |
끄적끄적 궁금증 (0) | 2023.12.08 |
cGAN (2) | 2023.12.07 |