석사 때 GradCAM을 이용하여 음향 장면 분류 모델에 대하여 각 class별 특징을 확인하고 논문으로 쓴 적이 있다.
이때도 작성해놓은 적이 있는데, 이번에 공부하면서 좀더 보충해서 작성하였다.
전에 작성했던 글!
CAM
Class Activation Map
- 이미지 분류 모델에서 이미지의 어느 부분을 보고 class를 예측했는지 시각화한다.
- CNN 모델 중 flatten layer 중 GAP(Global Average Pooling)이 사용된 모델에 사용한다.
* GAP: 마지막 feature map의 각 채널은 1개의 값으로 변환되며 각각의 weight가 곱해져서 output layer에 입력된다.
이때의 weight는 feature map의 채널에 대한 weight라고 볼 수 있다.
- Convolution layer를 거쳐 얻은 마지막 feature map을 꺼내와서 채널별로 대응하는 weight를 곱한 후 모두 더해주면
모델이 어느 부분을 보고 class를 분류했는지 알 수 있다.
GradCAM
Gradient Class Activation Map
- Gradient signal을 통해 최종 결과에 대한 미분값을 feature map과 결합하여 모델이 어떤 부분을 보고 결과값을 예측하였는지 그 중요도를 히트맵으로 표시한다.
- CAM과 다른점: weight를 구하는 방법이 다름 → gradient(미분) 개념을 사용하여 weight를 구할 것
- 관찰하려는 convolution의 gradient와 그 layer를 통과한 output 정보(feature map)가 필요하다.
GradCAM 예시
GradCAM 구하는 방법
1) Feature map의 각 원소가 특정 calss에 주는 영향력인 Gradient를 구한다.
클래스 c에 대한 예측 스코어인 $y^c$를 Feature map 내 i,j에 위치한 값으로 미분한다.
Feature map이란 관찰하려는 layer를 통과한 output을 말한다.
2) 각 Feature map의 Gradient 평균을 구한다.
위(1)의 과정처럼 $y^c$에 대해서 모든 Feature map의 i, j 좌표으로 미분한 값(Gradient)이 있을텐데
이들의 평균을 구한 것이 weight이다.
여기서 Z는 feature map의 개수이다.
이 weight는 $y^c$값이 나오도록 하는데에 얼마나 중요한 역할을 하는지에 대한 weight값이다.
3) Featuremap과 weight를 선형결합하고 이때 ReLU를 사용한다.
ReLU를 사용하는 이유는 관심 class에 positive한 영향을 주는 특징에만 관심이 있기 때문이다.
$y^c$는 확률값이고 이 값을 증가시키기 위해 강도를 증가시켜야 하는 픽셀에만 관심이 있다.
위의 과정을 통해 얻어진 값으로 히트맵을 그려서 많이 활성화된 부분이 예측값이 그렇게 나오도록 하는데에 영향을 주었다고 해석을 한다.
GradCAM 코드
출처
[1] https://realblack0.github.io/2020/04/27/explainable-ai.html
[2] https://wordbe.tistory.com/entry/Grad-CAMGradient-weighted-Class-Activation-Mapping
[3] https://velog.io/@tobigs_xai/CAM-Grad-CAM-Grad-CAMpp
[4] https://github.com/vickyliin/gradcam_plus_plus-pytorch
'Deep Learning > XAI' 카테고리의 다른 글
[XAI] LRP (0) | 2022.03.28 |
---|---|
[XAI] SHAP (0) | 2022.03.28 |
[XAI] LIME (0) | 2022.03.22 |
댓글