[U stage DAY 30] CV (6) - CNN Visualization

먼지감자·2021년 9월 14일
0

AI Boostcamp 2기

목록 보기
23/48
post-custom-banner

강의 내용 복습

(06-1강) CNN Visualization

1. Visualizing CNN

1.1 What is CNN visualization?
neural net은 학습 및 추론 과정을 정확히 알 수 없는 black box

시각화한다는 것은 debugging을 하는 것과 같음

ZFNet example

1.2 Vanilla example: filter visualization
AlexNet의 첫 layer -> 사람이 해석하기에는 조금 어려움

1.3 How to visualize neural network

2. Analysis of model behaviors

2.1 Embedding feature analysis
high level feature를 분석

  • Neareast Neighbors(NN) in a feature space
    파란색 박스를 보면 물체의 자세와 위치가 다른데도 같은 class로 묶은 것을 볼 수 있음. 이는 잘 학습이 된 것

    <NN 동작방식>

    1. 미리 학습된 모델 준비

    2. FC layer 직전의 마지막 conv layer의 출력인 high level feature vector 사용

    3. 입력을 넣었을 때 그 feature vector 를 high dimensional feature space에 위치시킬 수 있음

    4. DB에 존재하는 모든 영상의 feature를 space에 위치시킴

    5. test하고자 하는 영상을 넣어 feauture space상에서 가까이에 있는 이웃들을 뽑아 해당 vextor들의 특징 분석

      단점
      feature vector space가 너무 고차원이면 사람이 이해하기 힘듬

  • Dimensionality reduction
    고차원의 space를 저차원으로 만듬
    t-distributed sochastic neighbor embedding (t-SNE)

    class간 예측을 시각화하여 어떤 class를 잘못해석하는지, class 간 분포 등을 확인할 수 있음

2.2 Activation investigation
middle level feature , high level feature 확인

  • Layer activation
    layer 의 activation을 분석하여 model의특징 분석

    Alexnet의 conv5의 138번 채널의 activation에 적당한 threshold를 주어 마스크로 만든 후 영상에 오버레이한 사진.
    여러 예제에서 이 채널은 공통적으로 얼굴을 찾는다든지, 계단을 찾는다든지 하는 특징을 찾을 수 있음
    특정 특징을 찾는 채널이 쌓아져서 detection을 하는 것이구나 라는 해석

  • Maximally activating patches

    midle level feature 시각화, 패치를 뜯어서 layer activation 관찰
    각 hiden node의 activation 에서 가장 큰 값을 갖는 부분을 패치로 뜯음

    <과정>

    1. 특정 layer에서 하나의 channel 선택
      (논문에서는 conv5의 14번째 channel 선택)

    2. 예제 데이터들을 backbone에 넣어 activation value 기록

    3. 해당 activation map에서 가장 큰 값을 가지는 부분이 원본 이미지에서 어느 receptive field인지 계산하고 그 부분을 crop

  • Class Visualization
    예제 데이터를 사용하지 않고 네트워크가 기억하고 있는 특징이 무엇인지 확인하는 방법

    새를 학습시킬 때는 배경에 나뭇가지가 있는 그림을 넣었구나, 개를 학습시킬 때는 어린아이가 함께 있는 사진을 넣었구나 라는 해석 가능

    <방법 : Gradient ascent>

    class activation을 최대화 하는 대칭적인 이미지를 생성하는 함수
    앞 항 : CNN = F(input) 의 class prediction을 최대로 만듬
    뒷 항 : input image의 L2 redularization을 통해 새로 만들어지는 이미지의 각 픽셀 값이 너무 커지지 않도록 함

    <과정>

  1. dummy image(blank or random initial = noise) 의 target class의 prediction score를 얻음
  2. 역전파를 통해 target score를 높여주는 gradient를 찾음
  3. input image를 업데이트
  4. 1~3 반복

    초기 이미지의 값을 어떻게 설정하느냐에 따라 결과로 나오는 image가 달라짐

3. Model decision explanation

모델이 입력을 어떤 각도로 바라보고 해석하는지 알아보는 방법
3.1 Saliency test
영상의 label을 판별하는데 중요한 부분을 찾는 방법

  • Occlusion map
    영상의 일부분에 patch를 붙인 상태에서 정답으로 판단하는 확률

  • Back Propagation

    1. 입력 영상에 대한 class score 계산
    2. 입력층까지 back propagation후 gradient의 절댓값 취하기
    3. 얻은 grdient의 절대적 크기를 시각화(누적해서 시각화해도 됨)

      Class Visualization 의 gradient acent방법과 유사하지만 차이는 입력으로 noise를 넣는게 아닌 실제 데이터를 넣어 사용되는 데이터가 어떻게 해석되는지를 본다. 즉, Saliency test의 Bacj Propagation은 data에 dependent하다

3.2 Backpropagate features

  • Rectified Unit (Backward pass)
  1. Forward pass
    ReLU 로 음수인 부분은 0으로 masking

  2. Saliency map
    forward 時 0으로 마스킹되었던 부분을 back propagation 때 다시 0으로 만듬

  3. Deconvolution
    forward에 관계없이 backward 時 음수인 부분을 0으로 masking. 즉 backward에서 gradient에 ReLU를 취함

  4. Guided Backpropagation

    2와 3을 and

    왜?
    두 마스크를 합한것이 forward를 할 때도 결과에 긍정적 영향을 미친 양수를 참조하고 , backward를 할 때도 gradient를 통해서 더 강화하는 방향으로 움직이는 gradient참조하면서 더욱 효과적인 방법이 됨

3.3 Class activation mapping(CAM)

  • GAP(Global Average Pooling)

    conv 이후 GAP layer를 거친 후 fc layer를 통과
    Sc=kwkcFkGAP=kwkc(x,y)fk(x,y)=(x,y)kwkcfk(x,y)CAMc(x,y)\begin{aligned} S_{c} &=\sum_{k} w_{k}^{c} F_{k} \\ {}^{GAP} {=} & \sum_{k} w_{k}^{c} \sum_{(x, y)} f_{k}(x, y)=\sum_{(x, y)} \stackrel{C A M_{c}(x, y)}{\sum_{k} w_{k}^{c} f_{k}(x, y)} \end{aligned}

    ScS_{c} : Score of class c
    kk : channel
    FkF_{k} : GAP feature
    fk(x,y)f_{k}(x,y) : Feature of map before
    (x,y)\sum_{(x,y)} : global average pooling

class score는 fc layer의 가중치와 GAP feature인 F를 곱한 것이다. F를 함수로 표현하면 (x,y)fk(x,y)\sum_{(x,y)}f_k(x,y), 즉 채널별로 GAP을 취해주는 것이고, 전체 수식이 곱하기와 더하기로만 이루어져 있으므로 순서를 바꾸면 마지막항 처럼 만든다.
마지막 수식을 보면, CAM은 GAP을 거치기 전이기 때문에 공간에 대한 정보를 가지고 있다.
따라서 CAM을 시각화하면 어떤 부분을 참조했는지 눈으로 볼 수 있다.

  • 제약사항
    네트워크 구조의 변경 후 재학습을 해야함
    재학습을 하면 pretrain 된 가중치가 바뀌기 때문에 성능도 달라짐

AlexNet, GoogleNet은 이미 GAP있음

  • Grad-CAM
    기존의 미리 학습된 네트워크의 구조를 변경하지 않고 시각화 가능
    CAMc(x,y)=kwkcfk(x,y){C A M_{c}(x, y)} = {\sum_{k} w_{k}^{c} f_{k}(x, y)}
    핵심은 CAM에서의 fc layer 의 가중치 (wkcw_{k}^{c})를 어떻게 구할 것이냐


Saliency map에서의 backpropagation과 비슷 .
여기서는 우리가 관심이 있는 activation map까지만 역전파를 수행하여 weight α\alpha를 구하고 채널 별로 activation map A와 가중합하여 더해준다.


Grad-CAM은 영상뿐아니라 다양한 모델 구조에서 활용가능하며 , Guided backprop과 합쳐 클래스 별로 rough한 특징 + 날카로운 특징까지 함께 보여줄 수 있다.

  • SCOUTER

    왜 해당 클래스라고 판단했는지 뿐만 아니라 왜 다른 클래스가 아니라고 판단했는지 정보까지 시각화 가능

  • GAN dissection

    생성모델도 hidden node가 어떤 부분을 생성하는지 찾아서 해당 위치에 door를 담당하는 부분에 masking을 하여 출력 결과를 user가 컨트롤 할 수 있음

Further Question

(1) 왜 filter visualization에서 주로 첫번째 convolutional layer를 목표로할까요?

뒤로 가면 filter의 channel이 커져 시각화가 사실상 불가능

(2) Occlusion map에서 heatmap이 의미하는 바가 무엇인가요?

patch의 위치를 바꾸어가며 영상의 모든 부분의 prediction score를 계산한 결과

(3) Grad-CAM에서 linear combination의 결과를 ReLU layer를 거치는 이유가 무엇인가요?

class 예측에 큰 영향을 미치는 부분만 골라내기 위해 음수는 0으로 만드는 과정을 거침

(06-2강) AutoGrad

pytorch Autograd

computational graph를 통해 back propagation 시 편미분을 편리하게 계산할 수 있도록 gradinet를 자동으로 계산해주는 api

  • requires_grad = True로 해줘야 gradient계산 가능
  • .backwrd는 메모리 효율을 위해 중간 결과는 free시킴. 따라서 두번 호출하면 runtime error. 여러번 호출해서 gradient를 accumulation 하고 싶다면 retain_graph인자를 True로 설정해주어야 함
y.backward(gradient, retain_graph = True) 
  • grad_fn

    x, y,z,w computational graph를 만들어준다음 각각을 출력해보면 y,z,w 가 가지고 있는 값과 grad_fn 값이 같이 나옴
    이때 각 인자가 어떤 연산으로 연결되어 있고, 각 연산에 맞는 back propagation을 class 생성자로 등록. 그 생성자가 바로 grad_fn

  • hook : register_forward_hook
    hooking : function call시 전달되는 인자를 낚아채는 것
    backward hook을 통해 역전파시 전달되는 기울기를 hook할 수 있음

  1. hook 호출시 호출되는 함수 정의
  2. hook 함수 등록
  3. forward시 지정한 구간에서 함수 실행됨

이외에도 forward전에 하는 register_pre_hook, backward에 하는 register_backward_hook 이 있음
이때 hook은 argument를 변경할 수 없음. 하지만 새로운 gradient를 return하여 전달되는 grdient 값 변경 가능
Grad-CAM 구현 시 register_backward_hook 사용.

그렇다면 hook을 통해 activation map을 어떻게 가져올까?

1. hook_feat함수 정의
2. register hook
3. forward


과제 수행 과정 및 결과


피어 세션


학습 회고

profile
ML/AI Engineer
post-custom-banner

0개의 댓글