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들을 더하면 결과가 더 좋아진다.
- Gaussian Blur Image
- Clip pixels with small values to 0
- 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를 만들 수 있는 방법을 제안하였다.
실시간으로도 가능하며 심지어 다양한 스타일도 합칠 수 있다.
'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 |