https://taeyoung96.github.io/cs231n/CS231n_12/
CS231n 12강 요약
CNN Layer들의 Data를 시각화 하는 방법에 대해 알아보자!
taeyoung96.github.io
https://memesoo99.tistory.com/37
cs231n - 12강 - Visualizing and Understanding
*본 글은 cs231n 12강의 내용을 정리 요악한 글입니다. 오늘은 ConvNet내부에서 어떤 일들이 벌어지는지 예쁘고ㅎㅎ 다양한 시각자료를 활용해 알아보겠습니다. CNN이 비난 아닌 비난(?)을 받는 가장
memesoo99.tistory.com
왜 Visualizingd을 해야 하는가?
블랙박스식을 탈피해야 한다! 딥러닝이 잘 작동되고 있음을 증명해야 하지 않겠는가? 그리고 뭐가 뭔지 해석을 할 줄 알아야 설득을 할 것 아니냐...
CNN을 예시로 들자. 첫 번째 Layer은, 입력이미지와 필터의 weight를 내적하여 만든 것이다.
따라서, 눈으로 보면 엣지성분이 많이 검출된다.
Alexnet에서는, 가로세로가 11의 채널 3개, 필터의 수는 64개.
ResNet-18은, 가로세로 7의 채널 3개인 필터가 64개.
그러면 layer가 깊어지면 어떤 효과를 볼 수 있을까? 인간이 해석하기에 난해한 값이 나온다.
딱봐도 뭔지 어렵다. 두번째 layer은, 첫번째 layer에 weight를 내적시켰다. RGB의 3채널은 명확히 이해가 직관적으로 가지만 16개는 약간 이해하기 어렵다(실제론 Feature의 개수). 실제론 Grayscale의 이미지를 16개로 표현을 하였으며, 이를 0~255의 값으로 Normalized를 진행한 것이다.
즉, 첫번째 layer에서는 원본 3채널짜리 이미지에 7x7 사이즈의 3채널짜리 필터 16개를 사용하여 각 부분당 16개의 특징맵을 적용시킨 여러 국소부위를 획득한다.
그런데 두번째 layer에서는, 이렇게 되면 이 16개로 쪼개진 국소부위들에 7x7의 16개채널짜리 필터 20개를 활용하게 되고, 이렇게 되면 그 값은 이해할 수 없게 된다.
이를 마지막까지 진행하게 되면, AlexNet 기준 Softmax를 거치기 전 FCN(Fully Connected Layer)의 특징 vector은
한 이미지에 4096차원의 특징벡터가 존재하는데,
각 이미지마다 특징 벡터를 Nearest Neighbor Algorithm을 돌리게 되면, 유사 이미지가 검출됨을 위에서 확인 가능.
이를 PCA나 t-SNE 알고리즘 등으로 2차원으로 축소 시,
다음과 같이, 군집화됨을 알 수 있다.
K-Nearest Neighbor Algorithm : 새로운 데이터가 들어왔을 때 어떻게 분류를 할 것인가? 정해주는 알고리즘이다.
- Train 과정 : 모든 train data를 기억한다.
- Predict 과정 : 입력 데이터를 train data와 비교하며 어떤 label 값을 가질지 예측한다.
K-Nearest Neighbor Algorithm에 영향을 미치는 parameters는 크게 두가지가 있다.
먼저 K값에 의해 Overfitting(과적합)이 일어나는 것을 막아준다.
예를 들어, K = 1일 때 다음과 같이 영역을 분류했다면

K값을 조절함으로써, 경계선을 좀더 부드럽게 만들어주거나 영역을 좀 더 잘 분류한다.

Distance Metric(거리 척도)에 따라서는 경계선에서 약간의 차이를 볼 수가 있다.
보통 L1 distance, L2 distance를 사용하는데

특정 벡터가 개별적인 의미를 가지고 있다면 L1 distance를, 일반적인 벡터 요소들의 의미를 모르거나 의미가 별로 없을 때는 L2 distance를 사용한다.
좌표계에 따라서도 Distance Metric이 어떤 것인지에 따라 결과 값이 달라진다.
앞선 예로 결과의 차이를 확인하면,

여기서 K값, Distance Metric(거리 척도)와 같은 Parameter들을 HyperParameter이라고 한다.
즉, HyperParameter는 학습을 하는데 영향을 미치는 parameter이고 학습을 하기 전 선택하는 parameter이다.
HyperParameter를 어떻게 하면 잘 선택할 수 있을까?
다양한 방법들이 있지만, Dataset이 있을 때 train, val, test로 나누어 한번도 보지못한 data에 대해 분류를 잘 하게 되는 Hyperparameter를 선정한다.

다음과 같이 교차 검증(Cross-Validation)을 하면 더 확실하게 분류를 잘하는 Hyperparameter 값을 찾을 수 있지만, deep learning분야에서는 잘 사용하지 않는다.

또한 분산간의 관계를 이용해서 Hyperparameter를 찾기도 한다.
하지만 이미지 분류에서는 K-Nearest Neighbor Algorithm을 잘 사용하지 않는데 그 이유는 다음과 같다.
1) Test에 시간이 오래 걸리며,
2) Distance Metric(거리 척도)는 픽셀단위에서 별로 유용한 정보가 아니고,
3) 차원이 늘어나면, 필요한 Train data 역시 기하급수적으로 증가한다.
CS231n 2강 요약
드디어 본격적으로 강의를 배우는 첫번째 시간이다.
taeyoung96.github.io
Activatino Map을 통과시킨 레이어의 모습을 시각화하면, 사람의 얼굴이 있는 부분이 활성화된 Layer가 있을 수 있다는데(얻어걸린 것), 그야말로 일부이지만 중간 레이어에서도 인간이 해석할 여지가 남아있는 레이어가 있음을 시사한다.
그렇다면 이를 통해, 일반적인 이미지가 어떤 것이 들어올 때 각 뉴런의 활성화가 최대화가 되는지 알아볼 수 있지 않을까? 에서 출발한 것이 Maximally Activationg Patches
이 슬라이드는, 17번째 Channel에서 이미지의 일부분을 시각화한 것을 나타냈다. 이곳에서는 13x13의 feature map이 나오는데, Input에서부터 network를 통과시키며 conv5의 17번째 layer에서 가장 높은 값을 나타낸 위치를 찾고, 그 지점에서부터 receptive field를 거슬러올라 input에서 나타내면 오른쪽 위의 사진이 나오게 된다. 이 채널은 푸르고 눈같은 이미지에서 크게 활성화됨을 추측할 수 있다.
오른쪽 아래의 사진은 더 깊은 Layer에서 추출한 이미지로, 더 깊은 Layer은 더 큰 구조를 추출한다는 것이 확인가능.
즉, 특정 layer의 특정 뉴런이 어떤 feature을 찾고 있는지에 대해 대략적인 추측이 가능하다.
또 다른 방법으로는 Occlusion Experiments가 있는데, 이는 입력의 어떤 부분이 classification을 결정했는지 알아보는 것. 입력이미지의 일부를 가리고 분류를 잘 하는지 확인하는 것으로, 입력의 일부를 가렸는데 네트워크 스코어에 변화가 있다면, 네트워크는 그 부분이 분류에 있어 중요하게 본다는 것을 알 수 있다.
혹은 Saliency Maps가 있으며, 어떤 픽셀을 보고 이미지를 분류하는지 알아내는 것이다. 각 픽셀별로 Gradient Descent방식으로 접근해, 영향력이 큰 픽셀을 찾는다.
개의 윤곽이 나타난다.
중간의 뉴런을 하나 택해서, 입력 이미지의 어떤 부분이 내가 선택한 뉴런에 영항을 주는지 알아볼 수도 있다. Guided BackProp이 그 방법 중 하나다.
ReLU의 Positive Gradient만 살려서 그 값을 구하면, 선명하게 활성화된 위치의 확인이 가능.
오른쪽 그림을 살펴보면,
1) Forward Pass(ReLU) : ReLU를 활성화함수로 사용해, 0이하 값은 전부 0이 됨.
2) Backward Pass - back prop : 구한 Gradient 중 ReLU를 활성화한 것만 값을 그대로 전달. 보면 알 수 있듯, ReLU가 활성화된 맨 윗그림의 파란 부분만 그대로 두번째 왼쪽에 반영되었음을 알 수 있다.
3) Backward Pass - deconvnet : gradient가 음수면 0을, 아니면 그대로 전달.
4) backward pass - guided back prop : ReLU 활성화 안
된것도 0, gradient값이 음수인 것도 0을 전달.
반면 Gradient Ascent라는, 네트워크의 weight를 고정시킨 후 해당 뉴런을 활성화시키는 General한 입력 이미지를 찾아내는 방법도 있다.
기존 Gradient는 Backprop으로 구하여, 입력 이미지가 들어오면 Weight값을 update시키기 위해 사용했다.
그러나 이것은 말그대로 Loss가 최대가 되는 parameter을 찾는 방법으로, 고정된 W에 대해 입력 이미지의 pixel값을 gradeint ascent로 바꿔가며 뉴런과 class score을 최대화시킨다.
여기서는 Regularization func을 추가하여, 이미지가 특정 뉴런의 값을 최대화시키는 방향으로 update되는데, 좀 더 자연스런 이미지를 만들기 위해 추가해준 것이라 보면 된다..고 한다.
위의 식의 I*가 이미지의 픽셀값을 나타낸다.
- 처음 이미지를 0으로 초기화 시킨다. (노이즈로 초기화 시켜도 됨!)
- Image의 현재 score를 계산한다.
- Image pixel 단위에서 Backpropagtion을 통해 gradient 값을 구한다.
- 이미지를 특정 뉴런이 최대화할 수 있도록 픽셀 단위로 update를 진행한다.
여기서 Regularization func으로는 L2을 사용했다.
Dumbbell을 가장 잘 찾는 network를 Gradient Ascent 방법을 통해서 가장 최적화된 그림을 보면, 마치 Dumbbell이 있는 듯한(?) 그림이 나타나는 것을 볼 수 있다.
이 때 색깔이 다채롭게 나타나는 이유는 실제 딥러닝 모델은 constrained optimization 과정으로 만들어지는데 여기 있는 이미지는 그러한 제약이 없어서 다채로운 색깔의 이미지가 만들어 졌다고 설명했다.
하나의 클래스가 다른 클래스로 classify되도록, image를 update할 수도 있다.

왼쪽은 코끼리로 정확한 classification이 됐지만 오른쪽은 koala로 classify 됐다.
이 두 이미지의 pixelwise 차이(Difference)를 보면 큰 차이가 있지는 않으나, 차이를 10배로 magnify하면 차이가 나타나지만, koala같은 모양이나 elephant같은 모양같이 의미있는 형태라기보단 노이즈가 보일 뿐이다.

Deep Dream :
- 입력 이미지를 CNN의 중간 Layer까지 통과를 시킨다.
- 해당 gradient를 activation value을 계산한 다음 그 값으로 저장을 시킨다.
- Backpropagation을 통해서 이미지를 update한다.
- 위의 내용을 반복한다.
위 절차를 골자로, 해당 layer의 특징을 갖고 gradient를 계산 시, 이는 네트워크가 이미 뽑아낸 특징을 더욱 증폭시킨다.
Feature Inversion : 이미지에서 특정 Layer에서 activation map을 추출한 다음, 이를 갖고 이미지를 재구성.
Gradient Ascent를 활용하며, 스코어를 최대화하는 대신 특징벡터의 거리가 최소화되는 방향으로 update시킨다.
즉, 새로 생성한 이미지의 특징벡터와, 기존에 계산한 특징벡터(Activation Map에서 추출한 특징벡터)의 거리를 측정.
위 식의 경우, Total Variation Regularizer라는 것으로, 상하좌우의 인접한 픽셀간 차이에 대한 패널티를 부여하는 방법.
CNN에서 구한 Feature만으로 역으로 input이미지를 생성하는 방법으로, input x*는 주어진 이미지와 새로이 생성할 이미지의 feature간의 간극을 최소화시키는 방향으로 gradient ascent된다.
얕은 Layer에서 Activation Map을 추출하면 원본 영상과 비슷한 이미지를 재구성하게 된다.
하지만 깊은 Layer에서 Activation Map을 추출하면 전체적인 구조만 가지고 이미지를 재구성한다는 것을 볼 수 있다.
Texture Synthesis : 구조적 컨텐츠를 활용하여 작은 디지털 샘플 이미지에서 큰 디지털 이미지를 알고리즘적으로 구성하는 과정
일반적인 텍스처 합성은 딥러닝으로 하지 않아도 잘 수행되지만, 글자를 이용하여 텍스처 합성을 하는 경우는 쉽지 않다.
글자가 깨지고 엉망으로 텍스처가 복사된다.
따라서 딥러닝 모델을 이용해서 텍스처 합성을 하는 방법들이 제안되었는데,
특정 Layer에서 Activation Map을 가져온 다음 Gram Matrix를 생성한다.
Gram Matrix란 서로 다른 공간 정보에 있는 Channel들을 가지고 외적을 계산하여 새로운 Matrix를 만드는 것을 말한다.
이 Matrix는 특징 벡터간 다양한 상관 관계를 한 번에 나타낼 수 있도록 만들어졌다.
Gram Matrix 대신 공분산 행렬을 써도 되지만, 계산량에서 이득을 보기 위해 Gram Matrix를 사용한다고 한다.
과정은 Gradient Ascent 과정과 비슷하다.
- Input Image를 넣고 Pretrained 된 VGG Network에서 다양한 Gram Matrix를 생성한다.
- Random Noise로 초기화 된 Image를 VGG Network를 통과 시켜 Gram Matrix를 생성한다.
- Input Image와 만들어진 Image의 Gram Matrix를 비교하여 L2 distance가 최소가 되도록 Loss값을 계산한다.
- 계산된 Loss 값을 이용하여 Backpropagation을 진행하여 이미지 픽셀의 Gradient를 계산한다.
- Gradient Ascent 방법을 통해 이미지의 픽셀 값들을 update한다.
- 위 단계를 반복하여 입력 이미지와 유사한 이미지가 만들어지도록 한다.
결과를 살펴보면 얕은 Layer에서 생성한 Gram Matrix를 가지고 이미지를 만들 경우, 공간적인 구조를 잘 살리지 못했다는 것을 확인할 수 있다.
좀 더 깊은 Layer에서 생성한 Gram Matrix를 이용해야 텍스처 합성에 잘 활용할 수 있다!
이 Gram Matrix는 아래와 같다.
1. input texture를 가지고 CNN에 넣는다.
2. 어떤 layer에서 convolution된 feature CxHxW를 가져온다.

HxW는 spatial grid로 생각할 수 있고, HxW의 한 점마다 C dimension의 vector를 지닌다.
이 C vector는 이미지의 해당 지점에서 어떤 형상을 띄는지에 대한 정보를 rough하게 담고 있다.
3. 그래서 이 convolution feature에서 C vector 두개를 선택하고, 외적을 진행해서 CxC matrix를 만든다.
이 CxC vector는 특정 포인트 두점에서 공통적으로 발현되는 성질에 대한 정보를 담고 있다.
4. 이 CxC matrix를 모든 point에 대하여 만들고 average 하면 gram matrix가 생성된다.
Gram matrix는 input image의 texture의 정보를 담는 일종의 descriptor역할을한다.
* Gram Matrix는 average과정에서 spatial information을 다 버렸다.
* 모든 경우의 수를 다 구해서 computation complexity가 되게 별로일거 같지만, Cx(HW)와 Cx(HW)의 Transpose를 곱하면 되므로 계산이 오히려 굉장히 수월하다.
이제 구한 descriptor를 가지고 아래의 neural process를 거치면 Neural Texture Synthesis가 완성.

이러한 텍스처 합성을 예술쪽에서 활용한 것이 Neural Style Transfer이다.
정확하게 말하자면 Gram Matrix를 재구성하는 것과 Feature를 재구성 하는 것을 합하여 만들어진 이미지 결과가 Neural Style Transfer이다.
Neural Style Transfer에서는 입력이 두 가지 인데,
첫 번째 Content Image는 우리의 최종 이미지가 어떻게 생겼으면 좋겠는지 알려주는 이미지이고,
두 번째 Style Image는 최종 이미지의 Texture가 어떻게 생겼으면 좋겠는지 알려주는 이미지이다.
최종 이미지는 Content Image의 Feature Reconstruction Loss도 최소화하고, Style Image의 Gram Matrix Reconstruction Loss도 최소화하도록 만들어진 이미지이다.
Style Transfer는 Deep Dream에 비해서 이미지를 생성할 때 Control할 것들이 많아진다.
하지만 Neural Style Transfer는 수많은 forward, backward 과정을 반복해야 하므로 굉장히 느리다는 단점이 있다..
따라서 Style Transfer를 위한 또 다른 네트워크를 학습시키는 방법이 있다.
합성하고자 하는 이미지의 최적화를 전부 수행하는 것이 아니라, Content Image만을 입력으로 받아서 단일 네트워크를 학습시키는 방법이다.
이 네트워크 학습시에는 content loss와 style loss를 동시에 학습시키고 네트워크의 가중치를 업데이트를 시킨다.
학습은 좀 오래걸리지만 한 번 학습을 시키고 나면 이미지를 네트워크에 통과시키면 결과를 바로 볼 수 있다.
지금까지 말한 Style Transfer의 단점은 네트워크 하나당 하나의 Style Transfer만을 만들 수 밖에 없다는 점이다.
따라서 구글에서는 Content Image와 Style Image를 동시에 넣는 방식으로 다양한 스타일을 만들어 내는 논문을 제안했다.
'버츄얼유튜버' 카테고리의 다른 글
Attention과 Transformer (0) | 2022.08.31 |
---|---|
Generative Models (0) | 2022.08.11 |
Detection & Segmentation (0) | 2022.08.01 |
RNN & LSTM (0) | 2022.07.30 |
여러 CNN 아키텍처(LeNet, GoogleNet, Alexnet, VGG, ResNet) (0) | 2022.07.28 |