본문 바로가기
CS231n

C231n(12) Visualizing and Understanding

by 민지기il 2024. 3. 23.

ConverNets 내부에 어떤 일이 일어나고 있을까
과정) input image(pixel) -> layers(conv, pooling) -> Class scores

- First Layer: Visualize Filters


Alexnet 첫번째 Conv의 결과로는 3X11X11 feature map이 나오게 되며  필터의 가중치와 입력 이미지의 내적을 통해 구해진다. feature map을 시각화 시키는 것으로 필터들이 무엇을 찾는지를 알 수 있는데 보통 엣지나 보색 등을 찾아낸다. 첫번째 레이어는 이미지와 가장 가까운 곳에 접하기 때문에 이미지의 특징을 잡아내는데 유리하다.

 

-Visualize the filters/kernels (raw weights)


처음에는 3x7x7의 16개 filter가 있다. ReLU나 ConV를 거친 후에 2번째 layer weight에서는 16 channel input을 받는다.  

중간레이어들을 살펴보면 이들은 대게 첫번째 feature map 특징들에서 특징들을 뽑아내는 것이기에 그럴듯 직관을 얻기가 힘들다.

그림에서 layer1에서는 7X7 크기의 이미지가 3 chanel(RGB) 값으로 16개의 필터를 가진 것을 나타낸다. layer 2에서는 7X7 크기의 이미지가 16개의 채널씩 20개의 필터로 layer 3에서는 7X7 크기의 이미지가 20개의 채널씩 20개의 필터로 나타나지는 것을 나타낸다.

 

-Last Layer

1) Nearest Neighbors

공간적인 정보를 없앤 (픽셀공간에서 벗어난) FC layer인 마지막 레이어에서는 어떨까

FC layer에서는 4096 dimension 가진다. 이때 픽셀 공간에서 벗어나게 되면서 근접한 이미지들의 특징들을 추출할 있게 된다. 슬라이드에서 왼쪽의 , 코끼리, 등대, 할로윈호박, 이미지는Test dataset이고 오른쪽의 이미지들은 특징 공간에서 L2 Nearest neighbors 비슷한 이미지들을 모은 것이다. 코끼리 이미지를 살펴보면 왼쪽에 있는 코끼리 사진과 오른쪽에 있는 코끼리 사진은 픽셀공간에서는 다르게 인식을 하여야 정상이다. 하지만 특징공간에서는 이들은 비슷한 이미지로 인식 있다. 이는 loss function 통해 학습한 것이 아니라 네트워크를 거치며 저절로 학습하게 것이다.

 

2) Dimensionality Reduction

PCA라는 비교적 간단한 알고리즘을 통해서도 있지만 특정공간의 시각화에 우수한 t-SNE 통해서 살펴본다면 이미지들의 특징에 따라 분류가 되는 것을 관찰할 있다. 위의 이미지는 MNIST 손글씨 이미지를 차원축소하여 숫자별로 군집화된 것이다.

, 정리해보면 입력이미지라는 첫번째 데이터가 주어진다. 그리고 CNN 거쳐서 4096 dimension 데이터를 가지게 되고 t-SNE 거쳐 2 dimension 데이터를 얻어 3종류의 데이터를 활용할 있다.

 

** t-SNE (t-Distributed Stochastic Neighbor Embedding): 고차원 데이터를 저차원 (2D 또는 3D) 공간에 시각화하는 사용되는 비선형 차원 축소 알고리즘 / 방식: 고차원 데이터의 유사성(데이터 포인트간의 거리) 계산하고 저차원 공간에서 데이터 포인트를 임의로 배치한다. /저차원 공간간의 데이터 포인트의 유사성을 비교한다. 저차원의 데이터 포인트를 조정해서 최대한 유사성이 일치하도록 한다. 이를 반복해서 최적의 저차원 표현을 찾는다.

 

Visualizing Activations

conv network를 webcam의 input stream에 동작시킨다. 

활성화 맵을 통해서도 이미지의 특징들이 추출될  있다. 그림은  레이어에서의 activation map 시각화한 것이다. 어떤 레이어든지 이미지의 특징을 담을 있는데 이는 어떤 레이어에서 이미지의 특징을 드러내는 feature map 나타날지 모른다는 의미이기도 하다.

 

1) Maximally activating patches

이미지의 어떤 부분이 각 뉴런들의 활성을 최대화하는지 시각화하는 방법이다.

슬라이드를 보면 Conv5 에서 128 X 13 X 13인 한 activation volumne을 가지는데 128개의 channel 중 17번째 channel 하나를 골라 어떤 이미지를 입력하였을 때 가장 활성이 잘 일어나는지를 보자. input에서부터 network를 쭉 통과시키며 conv5의 17번째 layer에서 가장 높은 값을 나타낸 위치를 찾고, 그 지점에서부터 receptive field들을 쭉 거슬러 올라 input에서 나타냈더니 오른쪽 위에 있는 그림의 결과가 나왔다.

Conv5는 convolution layer이기 때문에 receptive field가 작은 편이다. 따라서, Conv5의 하나의 뉴런(한 뉴런은 Conv5 activation map의 하나의 scalar값을 의미)은 하나의 이미지에서 특정 부분만 보고 있다. 따라서, 하나의 뉴런은 어떤 이미지의 특정 부분의 특징을 잘 추출하여 활성화하는지를 알 수 있다.

그런데 Conv5는 convolution layer이기 때문에 한 채널 안의 모든 뉴런들은 모두 같은 filter의 가중치를 공유한다. 따라서, 모든 뉴런들이 각각 다르게 이미지의 특정부분을 보고 동일한 특징들을 활성화하는지를 볼 수 있다.

또한, 슬라이드에서 위에서의 patch보다 아래에서의 patch의 receptive field가 좀 더 넓은데 이는 아래가 좀 더 깊은 layer에서 추출한 것이기 때문이다.

-> 특정 layer 특정 neuron에서 어떤 feature들을 찾고 있는지에 대한 대략적인 아이디어이다.

 

2) Occlusion Experiment

입력의 어떤 부분이 분류를 결정짓는 근거가 되는지에 관한 실험이다핵심 아이디어는 이미지에서 특정 패치를 뽑아 가린 후에 네트워크가 이미지를 예측한 확률값을 기록한다. 이를 sliding window 방식으로 전체를 진행한다. 이미지의 중요한 부분을 뽑아냈다면 당연히 이미지의 예측확률이 현저히 줄어들 것이다.

오른쪽의 heatmap patch 위치에 따른 네트워크의 예측 확률의 변화를 의미한다. 빨간 부분을 가렸을 시에 이미지 예측 확률이 많이 떨어진 것인데  빨간 부분이 진할수록 예측에 critical 하다는 걸 알 수 있다.

 

3) Saliency Maps

이미지의 어떤 pixel이 classification에 영향을 줬는지 체크한다. 각 픽셀별로 결과에 얼마나 영향을 끼치는지 예측한 클래스 스코어를 Gradient Descent방식으로 계산해서 영향력이 큰 pixel들을 찾아낸다.

 

4) Guided backpropagation

어떤 이미지가 들어왔을 네트워크의 중간 뉴런의 값을 선택한다. 이미지의 어떤 부분이 내가 선택한 뉴런에 영향을 주는 것인지 보는 것이다. 경우에는 이미지의 픽셀에 대한 "클래스 스코어" 그래디언트를 계산하는 것이 아니라 입력 이미지의 픽셀에 대한 "네트워크 중간 뉴런" 그레디언트를 계산한다. 이를 통해 어떤 픽셀이 해당 뉴런에 영향을 주는지 있다.

 

Visualizaing CNN features

 

- Gradient Ascent

위에서 다룬 거의 모든 실험적 방법들은 전부 어떤 이미지 I의 어떤 부분들이 neuron을 활성화하는지, input이미지에 따라 다 다른 결과가 나다. (이미지에 상당히 rely하는 방법) (image->neuron)

반대로 어떤 neuron(weight)이 주어졌을때 그 neuron을 활성화 시키는 generalized한 image는 어떤게 있을까 (neuron->image)

이를 알아보기 위해 Gradinet Ascent를 진행한다.

Gradient Ascent: 말 그대로 Loss가 최대가 되는 Parameter를 찾는 방법이다.

-W(가중치)를 고정하  input image pixel value gradient ascent 바꿔가면서 neuron이나 class score 극대화하는 것이다.

- Regularization R(I)는 Generated Pixel들이 network overfitting되지 않도록 하기 위해서 필요하다.

 

Gradient decent(backprop)

- loss를 최소화시켜 네트워크를 학습하는 방법하였다. (가중치의 값들이 유동적)

- regularization term: 가중치들이 학습데이터의 과적합을 방지하기 위함이다.

 

gradient ascent를 위한 초기이미지로 zeros, uniform, noise 등으로 초기화한 후 다음과 같은 과정을 거쳐 이미지를 탄생시킨다.

1. 제로픽셀 이미지

2. 현재 스코어값 계산을 위해 이미지 forward

3. Image 픽셀의 뉴런값과 gradient를 얻기 위해  backprop

4. image 업데이트

위의 과정을 거친 실험의 결과이다. Gradient Ascent를 통해 뉴런을 최대로 활성화 시키는 합성 이미지들이다.

이제 중요한 Feature 들을 부각시켜 볼 수도 있다. 여기에 추가로 아래의 Regularization들을 더하면 결과가 더 좋아진다.

  1. Gaussian Blur Image
  2. Clip pixels with small values to 0
  3. Clip pixels with small gradient to 0

-Multimodality

클래스마다 clustering 알고리즘을 수행하여 클래스 서로 다른 모드들끼리 다시 클래스가 나뉘게 한다.

그리고 나뉜 모드들과 가까운 곳으로 초기화 해준다. 이와 같은 방법을 수행하면 식료품점 이미지 8 장이 다른 이미지와 다름에도 multimodality 명시하게 되면 이미지 생성 다양한 결과를 얻을 있게 된다.

 

- prior information (feature inversion network)

 Imagenet 특정 클래스를 최대화하는 이미지를 생성해낸 것이다이는 입력 이미지의 픽셀을 곧장 최적화하는 대신 FC6 최적화하는 것으로 feature inversion network 사용해야 한다. 핵심은 사전정보를 통해 real 이미지에 가깝게 생성을 있다는 것이다.

 

-Fooling images

이미지 픽셀의 그라디언트를 이용하여 이미지를 합성하는 방법을 이용하여 네트워크를 속이는 이미지를 만들 있다.

1. 임의의 이미지에서 시작 (ex. 코끼리 이미지)

2. 임의의 클래스를 선택 (ex. 코알라 클래스)

3. 클래스를 극대화하기 위해 이미지를 변경 (ex. 코끼리 -> 코알라로 분류하도록 이미지 픽셀값을 랜덤하게 변경)

4. network fooled 때까지 반복

 

왼쪽 2개의 이미지는 우리가 보기에는 동일하나 네트워크는 왼쪽은 정상적으로 오른쪽은 fool image class 분류한다.

 

Style Transfer

-Deep Dream

 

1. Forward: 선택된 레이어에서 activation을 계산

2. activation과 동등한 선택된 레이어의 기울기를 설정 (네트워크가 이미지에서 뽑아낸 특징들을 더욱 증폭시키는 역할)

3. backward: 이미지의 기울기를 계산 (L2 norm을 최대화시키는 것)

4. 이미지를 업데이트

얕은층으로 Deepdream 수행 엣지나 소용돌이 모양이, 깊은 층으로 수행 개와 달팽이의 모습이 많이 보인다. (이는 개와 달팽이 데이터의 수가 많기 때문이다.)

 

-Feature Inversion

이미지를 네트워크에 통과시킨 후 특징(activation map)을 저장한다. 그리고 이 특징만을 가지고 이미지를 재구성한다. 이로부터 이미지의 어떤 정보가 특징 벡터에서 포착되는지를 짐작할 수 있다. gradient ascent 방법을 이용하기에 스코어를 최대화시키는 것 대신 특징 벡터 간(기존에 계산해 놓은 특징벡터와 새롭게 생성한 이미지로 계산한 특징벡터 간)의 거리를 최소화하는 방법을 이용한다.

feature inversion 통해 네트워크가 깊어질수록 저수준의 정보들은 사라지고(픽셀값이 정확히 얼만인가) 의미론적 정보들(색이나 텍스쳐) 유지하려는 것으로 보인다.

식으로 나타내면 다음과 같다.

 

-Text Synthesis

신경망 대신 scan line 따라서 픽셀씩 이미지를 생성해 나가는 방식으로 컴퓨터 그래픽 분야에서 전통적으로 연구해오던 분야 하나이다. 현재 생성해야 픽셀 주변의 이미 생성된 픽셀들을 살핀 입력 패치에서 가장 가까운 픽셀 계산하여 입력 패치에서 복사하여 붙여넣는 방식이다.

- Neural Texture Synthesis: Gram Matrix

 

신경망을 활용한 Texture Synthesis 문제를 해결하려고 한 시도들 중 gram matrix를 이용한 방법이 있다. 

이미지를 네트워크에 통과시킨 특정 네트워크에서의 feature map 가져온다.

이때 특징맵의 크기는 C(channel) x H(image height) x W(image width) 가진다. 여기서 이미지의 픽셀 (HxW에서의 ) 뽑아 C차원의 벡터로 뽑는다고 해보자. 이때 벡터는 이미지의 해당 region의 특징을 담고 있다. 이제 이와 같이 HxW에서 점을 택하여 C차원의 벡터를 뽑아 외적을 CxC 행렬은 점의 특징들 간의 co-occurrence 가지고 있다. 행렬의 (i,j)요소가 크다는 것은 (i,j) 모두 크다는 것이고 이는 점이 동시에 활성화되는 특징이 무엇인지 있다는 것을 말한다. 과정을 HxW grid에서 전부 수행한 평균을 계산하여 CxC gram matrix 구한다. CxC matrix 이미지 지점에 해당하는 값들을 모두 평균화한 것이기에 공간정보를 모두 날려버린 것과 같다.

 

공분산 행렬을 쓰지 않고 gram matrix를 사용하는 이유는 성능은 공분산 행렬이 좋지만 공분산 행렬은 C x H x W와 같이 3차원 텐서의 연산으로 구해야 해서 계산비용이 매우 비싸지만 gram matrix의 경우에는 C x (HW)의 연산을 하는 것이기 효율적이기 때문이다. 결론적으로 gram matrix를 통해서 이미지 텍스처 기술자를 만든다.

1. 입력이미지를 pretrain 된 VGG network에 통과시켜 다양한 레이어에서 gram matrix를 계산한다.

2. 원본 이미지와 생성된 이미지의 gram matrix 간의 차이를 L2 norm을 이용해 loss를 계산한다.

3. 계산된 loss를 이용하여 Backprob을 통해 생성된 이미지 픽셀의 그레디언트를 계산한다.

4. gradient ascent를 통해 이미지 픽셀을 조금씩 업데이트 한다.

5. 위와 같은 방법으로 Gram Matrix계산 -> Loss 계산 -> backprob 반복하여 입력 텍스처와 유사한 텍스처를 만들어낸다.

 

레이어가 깊어질수록 이미지의 패턴들을 재구성해냄을 확인할 있다.

 

-Neural Style Transfer

이와 같은 방식을 예술 작품에 적용하려는 시도도 등장한다.

gram matrix 이용한 텍스처 합성을 이미지에 대해 적용하고 feature inversion 조합한다.

, texture snythesis feature inversion 조합하는데 이것이 style transfer이다.

최종 이미지를 만들어내기 위해 content image style image 필요하다. content image 네트워크에게 우리의 최종 이미지의 형태 혹은 뼈대를 알려주는 이미지이고, style image 네트워크에게 어떤 스타일 (혹은 텍스처)인지를 알려주는 이미지이다.

최종 이미지는 content image feature reconstruction loss 최소화하고 style image gram matrix loss 최소화하여 최적의 이미지를 생성해낸다.

 

content image style image 입력을 달리하여 출력의 변화를 있고, 이들의 joint loss function 가중치를 조절하여 어느 부분에 집중할 것인지도 결정할 있다. style image 크기를 resize하여 넣어주면 스타일 (혹은 텍스처) 스케일도 조정할 있고 여러 style image 입력할 수도 있다.

많은 backward/forward 과정이 반복되어야 하므로 매우 느리기 때문에 style transfer 위한 다른 네트워크를 학습시키면 된다.

 

-Fast Style Transfer

 

style image 고정시킨 content image 만을 입력 받아 결과를 출력할 있는 단일 네트워크를 학습시키는 방법이다. 학습 content loss style loss 동시에 학습시켜 네트워크 가중치를 업데이트 한다. 학습에는 오랜 시간이 걸리나 학습을 마친 이미지를 네트워크에 입력하면 곧바로 결과가 나온다. 이는 출력이 RGB라는 점을 제외하면 semantics segmentation 매우 유사하다.

 

위의 방법의 단점은 하나의 네트워크가 하나의 스타일 (혹은 텍스처) 표현할 있다는 것이다.

구글에서는 하나의 네트워크만 학습시켜서 다양한 style result 만들 있는 방법을 제안하였다.

실시간으로도 가능하며 심지어 다양한 스타일도 합칠 있다.

출처: https://biology-statistics-programming.tistory.com/132

'CS231n' 카테고리의 다른 글

Assignmenft 1-3 (SoftMax)  (1) 2024.03.30
CS231n(11) Detection and Segmentation  (0) 2024.03.18
Assignment 1-1 (KNN)  (0) 2024.03.18
Assignment Python Tutorial  (1) 2024.03.14
CS231n(10) Recurrent Neural Networks  (0) 2024.03.13