브렌쏭의 Veritas_Garage

[CS231n] #2. 이미지 분류(1) 본문

[Project_하다]/[Project_공부]

[CS231n] #2. 이미지 분류(1)

브렌쏭 2024. 6. 27. 10:51

 

Assignment

  • K-Nearest Neighbor 구현
  • Linear Classifiers: SVM, Softmax 적용하기
  • Two-layer neural network 
  • Image features

CS231n Convolutional Neural Networks for Visual Recognition 

 

CS231n Convolutional Neural Networks for Visual Recognition

 

cs231n.github.io

이 링크에서 모든 과제 관련 정보를 얻을 수 있다.

Image Classification Pipeline

분류가 되는 방식은 주어진 정보를 바탕으로 

미리 지정한 카테고리 이름 중에서 (<- 중요)

올바른 이름을 도출해내는 것

 

이미지라는 것은 결국 뜯어보면 컴퓨터가 보기에는 16진수나 2진수로 되어있는 Blob, hex 데이터에 불과하므로 고양이 이미지를 바탕으로 컴퓨터가 인식하고 분류하는 것은 상당한 난이도를 요한다

 

뒤집히고 흐릿하고 땡그란 고양이를 보면 혼란해지는 것이다

def find_cat(input):
	# do something awsome algorythm
    return is_cat

 

일단 제작해보려 하면 그저 마음이 먹먹해진다.

 

우선적으로 데이터 중심으로 진행해보자

Data Driven Methodology

Train -> Predict

 

1. 먼저 수많은 데이터셋을 바탕으로 어떤것이 고양이인지 학습을 시킨다. 

2. 그리고 새로운 고양이 사진을 찍은 뒤 물어보면 예측을 하는 것이다.

 

훈련된 데이터를 바탕으로 주어진 이미지가 어디에 가장 유사한지를 판별한다

주어진 이미지와 가장 비슷한 훈련데이터를 유사도를 기준삼아 나열한 뒤

가장 가까운 훈련데이터의 분류를 따라간다.

 

import numpy as np

class NearestNeighbor:
	def __init__(self):
    	pass
        
    def train(self, X, y):
    	""" X는 N x D 행렬, 각 행이 예시 샘플들이다. Y는 1차원 백터가 크기가 N 인 형태 """
    	self.Xtr = X
        self.Ytr = y
        
    def predict(self, X):
    	""" X는 N x D 행렬, 각 행이 분류를 하고싶은 데이터 """
    	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[1, :]), axis = 1)
            # 가장 가까운 데이터의 인덱스 찾기
            min_index = np.argmin(distances)
            # 예측 결과값 도출
            Ypred[i] = self.Ytr[min_index]
         
        return Ypred

킹갓 Numpy 에서 어려운 계산은 전부 처리함으로써 코드를 매우 간결하게 구현가능하다.

 

대략 이런 식으로 결과가 학습되게 된다

각 색상의 점이 분류가 다른 예시들이며 서로 땅따먹기를 하듯 경계가 생긴것을 볼 수 있다 (Nearest Neighbor)

 

이 경우에 초록색 카테고리 안에 노란색이 있는 등 분류가 이상한 것도 있고,

경계선에 지그재그로 서로 지퍼처럼 맞물린 지점이 있는 등 분류를 어렵게 하는 요소가 된다.

 

K-Nearest Neighbor

가장 가까운 경계가 아니라, 유사한 순으로 K개의 이미지를 제시하고 

그 중에서 가장 다수인 분류를 결과로 도출한다.

 

위 고양이를 제시했을 때, 훈련 데이터 중 유사도 기준으로

[1위 고양이사진]  [2위 강아지사진]  [3위 고양이사진]  [4위 강아지사진]  [5위 강아지사진]

이라면 

 

K=1 일때, 고양이로 분류

K=3 일때, 고양이가 2표니까 고양이

K=5 일때, 강아지가 3표라서 강아지

라고 판단한다.

 

이를 통해 특정 Outlier 를 무시하고 분류를 가능하게 해준다.

K 가 커질수록 경계가 뚜렷해진다 (일반화 된다)

그리고 K는 당연히 홀수로 넣어야 50:50으로 판단할수없는 헛짓거리를 피할수 있겠죠?

 

Hyper Parameter

위에서 K 의 값과 같은 요소는 정답이 있는 것이 아니라 사용자가 임의로 지정해줘야 하는 것인데

하이퍼 파라미터라고 부른다.

 

 

결론적으로는 '적당히', '적절한' 값을 넣는 것이 좋은데, 어떻게 그 좋은 값을 찾아낼까

 

Hyper parameter : 훈련할 데이터, 검증할 데이터, 실제로 테스트할 데이터

모의고사에서 날고 기어도 실전에서 노답이면 애초에 써먹을 수가 없으므로, 훈련데이터로 예측률을 100% 가까이 올리는 것은 무의미하다.

 

1. 훈련을 시킨 뒤에 실제 실전 테스트 데이터를 제공해 거기에서 좋은 결과를 낸 파라미터로 정한다

2. 훈련 뒤에 검증용 데이터로 실전같은 모의고사를 치루고 가장 좋은 성적의 파라미터를 지정한 뒤, 실전에 한번만 투입한다

 

+ Cross validation)

- 코호트 연구마냥 나눠서 검증하는 방식

 

 

Comments