주제 : CAM
: CNN모델이 이미지를 분류할 때 이미지의 어떤 부분을 보고 해당 class로 예측했는지 시각화 하는 방법

https://donghwa-kim.github.io/CAM.html
CNN 기본 구성
처음에 convolution layer를 쌓고 사이사이에 pooling을 추가한다. 그러다 어느 정도 특징이 두드러질 때 쯤 fully-connected layer(fc)를 사용해서 최종적으로 어떤 class에 속하게 될지 확률을 나타낸다.
보통 convolution을 사용하면 어느정도 위치 정보를 활용한다고 하지만, fully-connected layer에 넣기 위해서 flatten해야하고 이런 feature들이 fc를 거치게 되면서 우리가 이해하지 못하는 정보로 바뀌게 된다.
하지만 이런 일반적인 구조 외의 다른 CNN구조도 가능하다. 마지막에 fc를 사용하는 대신, Global Average Pooling(GAP)을 사용한다. 간단하게 설명하면 convolution layer에서 우리가 분류해야하는 class의 수만큼 채널을 갖게한다. 그리고 얻은 channel에서 각 채널을 기준으로 평균(합)을 구한다. 구한 각각의 값들이 class에 대응하는 값들이 되는 것이고, 가장 큰 값을 가지는 부분으로 예측을 하게 된다. 이런 방식으로 CNN을 구현한다면 마지막 fc를 사용하지 않게 되어 parameter의 수를 줄일 수 있게 된다.
→ 다른 말로 하자면 위치 정보를 그대로 사용한다고 해석할 수 있겠다.
Class Activation Mapping
마지막 convolution layer를 거치고 feature map을 얻었다고 하자.
k번 째 채널의 값들 중 (x,y)에 위치한 값을

라고 표현하자.