[CS231n] 12. Visualizing and Understanding
📗강의노트/CS231n

[CS231n] 12. Visualizing and Understanding

728x90
반응형




필터와 내적한 결과가 first layer에 입력된다.  ( 학습된 가중치 )

우선 가장 많이 찾는 것은 ‘Edge’성분이다. 흰/검으로 길게 늘어선 필터들이 보인다. 보색도 보인다. 

CNN을 어떤 모델/ 데이터로 학습하건 간에 첫 번째 레이어는 전부 다 이런 식으로 생겼다. 시각화 함으로써, 첫 번째 레이어가 무엇을 찾고 있는지 알 수 있다. 




레이어가 깊어질 수록 더 알아보기 힘들다. 적당한 직관을 얻기가 힘들다. 연결이 되어있지 않기 때문이다. 




T-SNE는 특징공간을 시각화하기 위해서 사용하는 PCA보다는 더 강력한 방법이다. 

군집들은 MNIST의 숫자를 의미한다. 




IMAGE-NET에도 적용 가능하다. 군집으로 나타남 

원본 이미지를 CNN으로 4096dim으로 표현하고, 이를 t-SNE로 2dim으로 줄였다고 보면 된다. 

중간 레이어의 가중치가 아니라 Activation map을 시각화 해보면 일부 해석할 수 있는 것들을 볼 수 있다. 



특징맵이 사람 얼굴에 집중되어있는 모습이 신기하다. 
유용한 특징을 알아서 발견했다. 




이미지의 일부를 가리고 난후 , 평균값을 채워 넣는 것이다. 

가려진 이미지를 네트워크에 통과시키고 네트워크가 이 이미지를 예측한 확률을 기록한다. 그리고 가림은 전체 이미지에 대해 돌아가면서(sliding) 같은 과정을 반복한다. 

만약에 이미지를 가렸는데 네트워크 스코어의 변화가 크게 발생한다면, 그 부분이 매우 중요했다라는 것을 이를 통해 알 수 있다. 




입력 이미지가 들어가고 각 픽셀들에 대해서, 예측한 클래스 스코어의 그레디언트를 계산하는 방법이다. 1차 근사적 방법으로 어떤 픽셀이 영향력있는지를 알려준다. 픽셀을 조금 바꿨을 때, 클래스 스코어가 얼마나 바뀔까??




입력 이미지의 각 픽셀에 대한 네트워크 중간 뉴런의 그레디언트를 계산한다. 어떤 픽셀이 해당 뉴런에 영향을 주는 지 알 수 있다. 

Guided backprop는 ReLU의 그레디언트 부호가 양수이면 그대로 통과시키고 부호가 음수이면 backprop하지 않는 방법이다.  ‘양의 그레디언트’만 고려하게 된다. 




Guided backprop를 이용하면 더 선명한 결과를 얻을 수 있다. 
패치의 어떤 부분이 뉴런에 영향을 미치는지 알 수 있다. 




여기서는 네트워크의 가중치들을 전부 고정시킨다. 그리고 gradient ascent를 통해 중간 뉴런 혹은 클래스 스코어를 최대화 시키는 이미지의 픽셀들을 만들어낸다. ( 최적화 방법 x ) 

여기에는 regularization term이 필요하다. 학습 데이터로의 과적합을 방지하기 위함이다. 

f(I)는 특정 뉴런의 값을 최대화시키는 방향으로 생성되길 원하는 것이고, 
R(I)는 이미지가 자연스러워 보여야 한다는 것이다. 

생성된 이미지가 비교적 자연스럽도록 강제하는 역할이다. 




gradient ascent를 위해서는 초기 이미지가 필요하다. Zero, uniform, noise등으로 초기화시켜준다. 

그리고 이미지를 네트워크에 통과시키고, 관심있는 뉴런의 스코어를 계산한다. 그리고 이미지의 각 픽셀에 대한 해당 뉴런 스코어의 그레디언트를 계산하여 back prop을 수행한다. 이 과정을 반복.




L2 norm을 통해 규제를 더해준다. 




주기적으로 값이 작은 픽셀들은 모두 0으로 만든다. 

이처럼 조금 괜찮은 regularizer들을 추가하게 되면 생성되는 이미지가 조금 더 깔끔해질 수 있다. 중간 뉴런을 최대화 시키는 이미지도 생성할 수 있다.  

이 방법은 이미지를 더 잘 나타내게 하기 위해, 더 강력한 사전 정보를 이용한다. 




이미지 픽셀의 그레디언트를 이용해서 이렇게 이미지를 합성하는 방법은 아주 강력

코끼리를 조금씩 변화시켜 코알라처럼 보이게 속인다. 보기에는 별반 차이가 없다. 이것이 GAN과 연결이 될 수 있을 것 같다. 




DeepDream은 재미있는 이미지를 만드는 것이 목적이다. 네트워크에 의해 검출된 해당 이미지의 특징들을 증폭시키려는 것으로 해석할 수 있다. 

그리고 이는 해당 레이어에서 나온 특징들의 L2 norm을 최대화시키는 것을 볼 수 있다. 




이미지가 있고, 이미지를 네트워크에 통과시킨다. 통과시킨 특징을 저장하고, 특징만을 가지고 이미지를 재구성 할 것이다. 

스코어를 최대화시키는 것 대신, 특징 벡터간의 거리를 최소화시키는 방법을 이용한다. 기존에 계산해 놓은 특징 벡터와 새롭게 생성한 이미지로 계산한 특징벡터 간의 거리를 측정 

Total variation regularizer은 상하좌우 인접 픽셀 간의 차이에 대한 패널티를 부여한다. 




네트워크가 깊어질수록 저수준의 정보는 사라지고 의미론적 정보들만을 유지하려 하는 것일지 모른다. 

Style transfer의 기반이다. 




작은 패턴을 크게 확장하는 것이다.  Scan line을 따라서 한 픽셀씩 생성하는 것이다. 가까운 픽셀을 계산하여 입력 패치로부터 한 픽셀을 복사해 넣는 방식이다. 




자갈 사진을 네트워크에 통과시킨 후, 네트워크의 특정 레이어에서 특징 맵을 가져온다. H,W는 Grid vector이고, C는 해당 지점에 존재하는 이미지의 특징을 담고 있다고 할 수 있다. 

두 벡터의 외적을 실행하여 CXC 행렬을 만든다. 서로 다른 공간에서 동시에 활성화되는 특징이 무엇인지 어느정도 포착해 낼 수 있다는 것이다. 




과정을 전부 (HXW) 수행해주고, 결과에 대한 평균을 계산해보면 C X C Gram matrix를 얻을 수 있다. 




특징맵 전체를 재구성하기 보다는, gram matrix를 재구성하도록 하는 것이다. 

생성해야 할 이미지를 랜덤으로 초기화시키고, 그 다음부터는 gradient ascent와 유사하다. 

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

그리고 Loss를 backprop를 통해 생성된 이미지의 픽셀의 그레디언트를 계산, 그리고 gradient ascent를 통해 이미지 업데이트. 




Style transfer




최종 이미지의 텍스쳐가 어땠으면 좋겠는지를 알려준다. 



네트워크에 content, style 이미지를 통과시키고, gram matrix와 feature map을 계산하다. 최종 출력 이미지는 랜덤 노이즈로 초기화. 

Forward/ backward를 반복하여, gradient ascent를 이용하여 이미지 업데이트

단점은 매우 느리다는 것! Forward/ backward를 많이 반복해야하고 메모리와 계산량이 엄청 크다. 




Style 이미지를 고정시켜 놓는다. Content image 만을 입력으로 받아서 결과를 출력할 수 있는 단일 네트워크를 학습시키는 방법! 

학습시에는 content / style loss를 동시에 학습시키고 네트워크의 가중치를 업데이트한다. 




지금은 발전해서 동시에 content / style을 넣어 다양한 스타일을 만들 수 있다. 




요약이다. 






















728x90
반응형