[CS231n] lecture 1. KNN 강의 요약
포스팅을 시작하기에 앞서 수준 높은 강의와 강의 자료를 무료로 배포해주신 Stanford University CS231n 교수진께 감사의 말씀을 드립니다.
온라인 강의: https://www.youtube.com/watch?v=vT1JzLTH4G4&list=PLC1qU-LWwrF64f4QKQT-Vg5Wr4qEE1Zxk
강의 자료: https://cs231n.github.io
Image Classification(이미지 분류)
Image Classification은 컴퓨터를 통해 이미지를 분류하는 작업입니다. 최근에는 AI를 통해 간단한 사진 분류는 인간보다 높은 정확도를 보이고 있으며 Stanford의 Fei-Fei Li 교수님께서는 이미지를 통해 이미지에서 어떠한 일이 일어나고 있는지 설명하는 단계까지 연구가 이루어지고 있습니다. ex. 잔디밭 위 파란색 반바지와 하얀색 티셔츠를 입은 남성이 손으로 자신의 발을 잡은 채 몸을 스트레칭 하고 있습니다. 그의 앞에는 축구공이 있으며 배경으로 검은 옷을 입은 또 다른 사람이 잔디 위에 누워있습니다 등.
사진 출처: https://pixnio.com/ko/media/ko-2267795
Nearest Neighbor
그렇다면 컴퓨터를 통해 어떻게 이미지를 분류할까요? 사람의 눈으로 보기에 이미지를 분류하고 해석하는 것은 매우 쉬워 보이지만 눈을 가지고 있지 않은 컴퓨터에게 이 작업은 매우 어려워 보입니다. AI에 관하여 사전 지식이 없으시다면 대개 함수를 통해 주어진 이미지를 분류하고 해석하려고 시도하실 것입니다. 하지만 이 시도는 여러분이 생각하는 것처럼 어떠한 함수를 어떻게 생성해야 하며 설사 함수를 작성해도 변형된 사진 등에 잘 적용될지 의문이 듭니다. 이러한 패러다임을 깬 방법이 Data-driven approach로 수많은 이미지 데이터를 통해
새로운 이미지를 추측하는 방법입니다. 그렇다면 어떻게 수많은 이미지로 새로운 이미지의 label을 추측할까요? 가장 간단한 방법은 컴퓨터가 보는 방법, 픽셀을 서로 비교하는 방법입니다. 즉, 각각의 픽셀에서 비슷한 값을 가지면 두 사진은 동일한 label을 가지는 것으로 생각할 수 있습니다.
새로운 이미지를 추측하는 방법입니다. 그렇다면 어떻게 수많은 이미지로 새로운 이미지의 label을 추측할까요? 가장 간단한 방법은 컴퓨터가 보는 방법, 픽셀을 서로 비교하는 방법입니다. 즉, 각각의 픽셀에서 비슷한 값을 가지면 두 사진은 동일한 label을 가지는 것으로 생각할 수 있습니다.
L1 Distance
픽셀을 비교하는 가장 간단한 방법으로는 두 픽셀의 절대값을 비교하는 방법이 있습니다.
dists[i][:]= np.sum(np.abs(self.Xtr-X[i,:]),axis=1) (self.Xtr: training image, X: test image)
위의 코드가 L1 distance를 이용하여 Train Image와 Test Iamge의 픽셀을 비교한 코드입니다.
보시면 행 별로 L1 distance를 적용하였는데 이는 계산의 편의성을 위해 np.reshape() 함수를 통해 하나의 이미지 데이터를 하나의 행으로 폈기 때문입니다. 즉 i번째 행은 i번째 image의 모든 pixel과 color데이터를 포함합니다.
L2 Distance
L2 distance는 절대값 대신 두 차이를 제곱하여 루트를 취한 값입니다.
코드는 다음과 같습니다.
dists[i][:]= np.sqrt(np.sum(np.square(X[i][:]-X_train),axis=1)
K-Nearest Neighbor Classifier(KNN)
위의 방법대로 픽셀간 비교를 통해 Test Image를 예측하는 방법은 예상하듯이 그리 좋은 효율을 보여주지 않습니다. (강의 노트에 따르면 CIFAR-10의 경우 35.4%의 정확도를 보여주네요.)
따라서 NN Classifier를 적용하여 가장 차이를 적게 보이는 사진 한 장만을 토대로 결과를 예측할 때 매우 불안정한 결과를 도출할 것입니다. 이를 해결하기 위해 K개의 후보군을 통해 가장 많이 뽑혀진 label를 결과값으로 도출하는 것이 확률적으로 더 좋은 정확도를 보일 것으로 기대됩니다.
Validation
그렇다면 후보군(k)을 어느정도로 설정하는 것이 알고리즘의 정확도를 극대화할 수 있을까요? 아쉽게도 이를 알 수 있는 방법은 직접 Training image를 통해 예측하는 방법밖에 없습니다.
(* Test Image의 경우 실제 문제에서는 Label을 모르기 때문에 Validation에 적합하지 않습니다.)
Validation의 효과를 극대화하기 위해 Training data를 n개로 나누어 Validation을 위한 set와 새로운 Training data를 위한 set를 구별 짓습니다. 이를 임의의 k에 대해 KNN을 수행하면 정확도의 평균과 표준편차를 구할 수 있습니다.
결론
* 데이터 전처리: 픽셀, color 데이터를 행으로 나열
* KNN 알고리즘
Class Nearest Neighbor(object)
def train()
- test image의 pixel 정보와 label 저장
def predict(k=k)
- L1 or L2 distance를 이용하여 가장 적은 차이를 보내는 이미지의 label k개 오름차순으로 저장. 가장 많은 개수를 가지는 label return
* Cross Validation
- 최적의 정확도를 가지는 변수 k 도출
* 실제 데이터 예측

