CS231N - Lecture 2 | Image Classification
input image 를 입력받아서 given set of discrete lables 에서 맞는 것에 assign 해준다.
Semantic Gap(의미적 차이) : 사람과 컴퓨터의 인식의 차이

: 카메라가 움직이면 모든 픽셀들의 값이 바뀐다.


: 다양한 자세나 형태에 따라 이미지의 분류가 어려울 수 있다.



: 다양한 종류의 Object들을 하나의 label로 분류하기 어려울 수 있다.
ex) 다양한 종의 고양이들

Algortithms should be robust to these different kinds of transformations !!
no obvious way to hard-code the algorithm for recognizing a cat, or other classes.
def classify_image(image):
# some magic here?
return class_label
결국 다음 함수와 같이 input image를 받아서 class label을 반환해주는 함수가 우리가 원하는 함수가 될 것이다.

이미지에서 edges를 추출하고 귀모양, 코모양과 같이 고양이에게 필요한 집합들을 하나하나 찾아서 다 있으면 고양이라는 label을 출력하는 방법이 있을 것이다. 하지만, 이와 같은 방법은 변화에 강건하지 않아서 결과값이 잘 나오지 않고, 강아지와 집과 같은 다른 객체들을 인식하려고 할 때 그 클래스에 맞는 집합을 따로 하나하나 만들어야돼서 굉장히 비효율적이다.
위와 같이 고양이, 강아지 등 특정 객체에 필요한 규칙들을 하나하나 만드는 것이 아니라 엄청나게 방대한 고양이, 강아지, 집 사진들을 컴퓨터에게 제시하고, machine learning classifier을 학습시키는 방법이다.
def train(images, labels): # Memorize all data and labels
# Machine Learning!
return model
def predict(model, test_images): # Predict the label if the most similar training image
# Use model to predict labels
return test_labels
image와 label을 입력 받아 머신러닝을 시키는 train 함수와 train 함수에서 반환된 모델을 가지고 테스트 이미지를 판단하는 predict 함수로 나누어진다.


test image와 train image는 각각 같은 사이즈를 갖고, 같은위치의 픽셀값 차이를 구해 단순히 합하게 된다. 이 값이 가장 적은 사진이 비슷한 사진으로 골라지는 것이다. 하지만, 단순히 픽셀값을 비교하는 것으로는 붉은벽돌이랑 붉은지갑이랑 같은 물체로 구분할 수 있는 가능성이 있다.
import numpy as np
class NearestNeighbor:
def __init__(self):
pass
# Memorize training data (just remembers all the training data)
def training(self, X, y):
self.xtr = X # X : matrix (N x D)
self.ytr = y # y : matrix (1 x N)
def predict(self, X):
num_test = X.shape[0]
Ypred = np.zeros(num_test, dtype = self.ytr.dtype)
for i in xrange(num_test):
# using the L1 distance
# -> for each test image, find closet train image
distances = np.sum(np.abs(self.xtr - X[i,:]), axis = 1)
min_index = np.argmin(distances)
Ypred[i] = self.ytr[min_index]
return Ypred

문제점

데이터간의 거리(distance)란 데이터간의 유사성을 말한다.

L1 Distance
다차원에서 단순히 두 점의 좌표들간의 차이의 절댓값을 더한 것으로 어떤 좌표계를 사용하느냐에 따라 값이 바뀐다.
L2 Distance
원점을 기준으로 모든 거리가 같기 때문에 좌표계에 따라 값이 바뀌지 않는다.
Q . Where L1 distance might be preferable to using L2 Distance ?
A . Input feature가 개별적인 의미를 가지고 있다면 L1이 좋지만, 일반적인 벡터이고 실질적인 의미를 가지고 있지 않다면 L2가 좋다.
룰루랄라 효니루 - [CS231n] 2강. L1 & L2 distance

train data에서 젤 잘 작동하는 hyperparameter로 결정하는 방식 (K=1이고 검증시에도 학습데이터를 사용)
: K=1의 경우 학습데이터자체는 완벽히 분류하게 되지만, 새로운 데이터로 test해보면 튀는 데이터로 인한 복잡한 분류로 인해 오히려 성능이 떨어지게 된다.
train & test data로 나누고, test data에서 최적인 hyperparameter로 결정하는 방식
: 이 역시 새로운 데이터를 만나면 성능이 떨어질 수 있다.
가진 데이터를 train, val, test 세개로 나누는 경우
: train data로 알고리즘을 학습하고 validation set으로 최적 hyperparameter를 찾고, test data를 마지막으로 실제 성능을 unseen data에서 확인해본다.
Cross-validation (교차검증)
: validation set를 따로 설정하는 것이 의미가 없을정도로 데이터가 부족한 경우, train set를 K개의 fold로 나누어 돌아가면서 validation set 역할을 한다. 이를 K-교차검증이라고 한다.
Dateset이 작다면 사용하지만, 딥러닝은 데이터의 양 자체가 방대하기 때문에 교차검증을 사용하지 않는다.



총 개수 가로픽셀수 x 세로픽셀수 x 채널수(컬러면 RGB로 3, 흑백은 1)로 이루어진 데이터들을 행렬계산을 위해 벡터로 쫙 펼치고, 각 클래스를 대변할 수 있는 parameter인 W(가중치, weights)와 b를 설정하여 결괏값을 구해 가장 score가 높은 class로 분류하게 된다. 여기서 사용되는 함수 f(x, W)가 직선의 방정식이라서 linear classifier라고 부른다.

2, 3번째 그림과 같이 직선만으로는 나뉠 수 없는 경우가 있고, 이를 해결하기 위해 여러층의 신경망을 쌓게 되는 것이다.