깨작깨작 공부

CS231n Lecture 2 | Image Classification 본문

머신러닝 | 딥러닝 강의 정리/CS231n Spring 2017

CS231n Lecture 2 | Image Classification

CodezTree 2019. 7. 29. 23:10

https://www.youtube.com/watch?v=OoUX-nOEjG0&list=PLC1qU-LWwrF64f4QKQT-Vg5Wr4qEE1Zxk&index=2

 

처음 시작 : 과제방 알림(?) etc..

 

# Image Classification : Computer Vision의 핵심 Task.

 

이미지 -> 카테고리를 분류하는 일

 

그러나.. 컴퓨터가 실제로 보는 것은...!! 

 

# Problem

 

3 채널 RGB로 이루어진 그래픽 값의 행렬이다.

본 강의에선 이를 Semantic Gap (의미적 차이?) 문제라고 부름.

 

# Challenges

  - Viewpoint variation : 카메라 이동시 모든 픽셀의 이동 문제

  - Illumination : 사진에서의 조명 변화

  - Deformation : 물체의 다양한 형태 변화 (ex. 강아지, 고양이)

  - Occlusion : 일부분 가려짐 (사전에서는 폐색 이라는데 뭔가 시원하지 않은 느낌이라 의역함)

 

 

만약 image classifier을 만든다 가정할때.... 물체를 인식하는 명확한 Hard-Coding 방법은 없다.]

 

Hubel & Wiesel가 edge와 corner을 찾아낸 데이터로 물체를 판별을 시도. -> 잘 작동 안함.

  1. 너무 느리고

  2. 다른 물체 인식하려면 다시 코딩해야 됨.

 

# Data-Driven Approach 방법

  1. 이미지와 라벨의 데이터 묶음을 모은다

  2. 머신러닝을 이용해 판별기를 학습시킨다

  3. 새로운 이미지에 대해 판별기를 평가한다

 

그래서 판별기는..??

# Nearest Neighbor (First Classifier)

  1. 모든 데이터를 기억하고

  2. 기억한 이미지를 바탕으로 가장 비슷한 라벨을 도출해 냄

 

 

# Comparing Images By NN

 

L1 Distance (Manhattan Distance)

  - L1 Distance : 두 값의 차의 절댓값의 합

 

 

# NN Classifier Code

import numpy as np

class NearestNeighbor:
	def _init_(self):
		pass

	def train(self, X, y):
		self.Xtr = X
		self.ytr = y

	def predict(self, X):
		num_test = X.shape[0]

		Ypred = np.zeros(num_test, dtype = self.ytr.dtype)

		for i in xrange(num_test):
			distances = np.sum(np.abs(self.Xtr - X[i, :]), axis = 1)  # Calculating L1 Distances
			min_index = np.argmin(distances)  # Find Min Distance Index
			Ypred[i] = self.ytr[min_index]  # Prediction

		return Ypred
        
# CS231n NN Code

 

코드는 크게 train과 predict 부분으로 나뉨. train 부분은 모든 학습 데이터를 기억하는 일을 하고 있음. predict는 입력된 테스트 값에 대해 모든 학습 데이터와의 L1 값을 계산하고 가장 Distance가 작은 값을 돌려줌.

 

(N개의 데이터에 대해)

Train 시간 복잡도 : O(1)

Predict 시간 복잡도 : O(N)

  -> 이 결과는 학습된 모델이 예측하는데에 많은 시간을 쏟는 모습으로 보아 실제 사용에 적합하지 않음.

(이상적이라면 학습이 오래걸리고 예측은 빠르게)

 

 

NN Classifier의 Decision Boundary의 시각적 표시

 

 

# KNN : K 개의 가까운 점으로 부터 테스트 데이터가 어디 속하는지에 majority vote (다수결 투표)를 통해 예측

 

KNN의 Decision Boundary

 

# L2 Distance

L2 Distance. 

  - L1 Distance에서 차를 제곱하여 합산한 후 루트를 씌워서 계산

 

 

-> L2가 L1 보다 좌표에 받는 영향력이 덜하고 더 자연스럽게 떨어짐.

 

 

# KNN 데모 사이트 (스탠포드) : http://vision.stanford.edu/teaching/cs231n-demos/knn/

 

http://vision.stanford.edu/teaching/cs231n-demos/knn/

 

vision.stanford.edu

 

 

# Hyperparameter

  - 가장 최적화된 k 값은 무엇일까? 가장 좋은 distance 방법은 무엇일까?

  -> 바로 이 값들이 hyperparameter : 학습 전에 우리가 설정해 놓는 알고리즘상의 값. (기계가 설정 X)

 

  - 이들은 case-by-case, problem-dependent 이므로 시도해 보며 적절한 값을 찾아야 됨.

 

 

# Hyperparameter 찾는 방법에 대한 고찰(?)

   1. Data에 적절하게 동작하는 hyperparameter를 선택한다. -> K=1이 항상 잘 동작한다. (학습에서만)

   2. Data를 Train과 Test로 나누어 Test에서 잘 작동하는 hyperparameter를 선택한다. -> 새로운 데이터에서 어떻게 작동 될지를 모른다.

   3. Data를 Train, Test 그리고 Validation으로 나누어 Validation에서 적절한 hyperparameter를 찾은후 test에서 검증한다. -> 괜찮은 방식임!

   4. Cross-Validation : 전체 Data를 fold들로 나눈후 각각의 fold를 validation으로 사용한후 결과값을 평균낸다. -> 이 방법은 작은 규모의 데이터셋에서 유용하다. 하지만 딥러닝에서는 그렇게 잘 안씀.

 

 

 

 

그러나!!!!! KNN은 이미지에서 절대로 안씁니다

 

  테스트 하는데 오래걸리고

  - 픽셀값에 대한 distance metrics는 유익한 정보가 아님

  - 이미지의 처리 차원이 늘어날 수록.. 계산량이 기하 급수적으로 늘어남. (지수 승..)

 

 

 

 

# Linear Classification

  - 딥러닝 모델은 많은 Linear Classifier의 결합 구조체.

 

# Parametric Approach ( 파라메트릭 모델링 접근법. 파라미터(매개변수)를 사용해 모델의 형상을 컨트롤 하는 모델링 방식 )

 

  - 이미지를 입력 받아 함수 f 에서 입력 이미지와 파라미터를 통해 Classifying 을 진행

  - W는 parameter, b는 bias (편향), x는 입력 이미지. Wx 는 행렬 곱

 

 

# Hard Case for Linear Classifier

  - Linear Classifier는 빨강과 파랑 영역을 평면 상 직선을 경계로 나누는 일을 하는데 위의 세가지 예시는 선형 분리가 어렵게 만드는 케이스들임.

 

 

# 다음시간 예고 : 그러면 선형 classify를 한 결과의 Good, Bad를 어떻게 판단할 수 있고 말할 수 있을까??

 

 

이 포스트에 쓰인 모든 컨텐츠의 저작권은 전적으로 Stanford CS231n Spring 2017 Course에 있음을 알립니다.

Comments