2016 cs231n 강의 내용을 정리해 올린 글입니다.

- Image Classificaiton

Image Classification은 컴퓨터 비전의 핵심 task이다. 이는 이미지를 input으로 하여 lable의 집합에서 어떤 하나의 레이블을 반환해준다. 이것이 가능하다면 Detection, Segmentation, Image captioning이 수월하게 가능해진다.

 

- The problem : Semantic gap

이미지는 [0,255] 사이의 숫자들로 이루어진 3D array로 표현되어진다. 

e.g 300(height)X100(width)X3(channel)

 

- The problem

Viewpoint Variation : 보는 시각(카메라 위치)에 따라 이미지가 달리 보일 수 있다.

Illumination : 조명에 따라 이미지가 달리 보일 수 있다.

Deformation : 형태의 변형으로 이미지가 달리 보일 수 있다. 

Occlusion : 다른 사물로 분별하고자 하는 물체가 가려져(은폐, 은닉) 식별이 어려울 수 있다.

Background clutter : 배경과 구분이 안 되는 수준으로 비슷하여 식별이 어려울 수 있다.

Intraclass variation : 같은 클래스 내에서 구분

 

- An image classifier

이미지(input) -> 레이블(output)

숫자 정렬과 같은 다른 알고리즘과는 달리, 특정 클래스를 구분해내는 hard-code 알고리즘을 구하는 명확한 방법은 존재 X

역사적으로, 그렇게 하고자 하는 시도들은 있어왔다... 이미지를 보고 특징적인  edge, shape로  라이브러리화를 하고 방향과 같은 특징들을 비교,, 그것으로 classifiy,, 하지만 scalable 하지 않아 잘 사용 X.. 

=> 그래서!.. Data-driven approach가 등장함.

 

- Data-driven approach

train : 훈련 이미지, 훈련 레이블 -> 모델

predict : 모델, 테스트 이미지 -> 테스트 레이블

1. 이미지, label 데이터셋을 수집

2. 머신러닝을 이용해 이미지 분류기를 훈련

3. 테스트 이미지들로 이미지 분류기를 평가

 

- First classifier : Nearset Neighbor Classifier

(현재는 사용하지 않는 분류기..)

train : 모든 훈련 이미지와 레이블을 그저 기억함.

predict : 테스트 이미지를 모든 훈련 이미지와 하나하나 비교하여 훈련 이미지와 가장 비슷한 레이블로 예측

 

Dataset : CIFAR-10

10개 레이블, 32X32 50,000개의 훈련 이미지, 10,000개의 테스트 이미지

 

실제 Nearest Neighbor Classifier로 분류한 결과, 그다지 정확하지 않은 결과

Nearest Neighbor Classifier는 distance metric을 이용해 이미지를 비교하게 된다. 

L1 distance(맨허튼 distance), 픽셀간의 차이를 구해 모두 더해준다.

 

코드로 표현하면 다음과 같이 된다.  numpy의 브로드캐스트 기능을 사용해 간단하게 표현 가능하다.

train에서는 그저 이미지를 기억하고, predict에서는 test 이미지와 train 이미지 사이의 거리를 구해 제일 거리가 작은 index를 구해 해당하는 lable을 반환한다.

 

해당 classification의 시간은 training data의 크기가 늘어남에 따라 linear 하게 증가한다. 

test time의 속도는 절대적으로 중요한 요소이기 때문에 Nearest Neighbor classification은 이와 같은 맥락으로 부적절하다.

반대로, CNN은 훈련에서 많은 시간을 필요로 하지만 test과정에서는 상대적으로 매우 짧은 시간을 필요로 한다. 

 

Nearset Neighbor Classification에서는 거리의 종류 또한 hyperparameter이다.

L1 distance, L2 distance.. 

 

- Classifier : K-Nearest Neighbor

K개의 가까운 이미지들을 찾아, 이 이미지들의 다수결로 vote 해 레이블을 찾아내는 방법

Nearest Neighbor Classification VS K-Nearest Neighbor

Q Nearest Neighbor Classifier로 훈련 데이터를 예측했을 때의 정확도는?

100%, 이미 훈련했던 이미지로 테스트를 진행하는 것이기 때문에 100%가 나온다.

 

Q K-Nearest Neighbor로 훈련데이터를 예측 했을 때의 정확도는?

상황에 따라 다름.. 다수결로 인해 부정확한 결과가 나올 수도 있다.

 

 

어떤 distance, 어떤 K로 설정해야 할까?... -> hyperparameter를 어떻게 설정해야 할까?

=> 문제에 따라 다르기 때문에, 주어진 환경에서 parameter를 실험해보고 가장 좋은 성능을 내는 parameter를 선택해야 함. 따라서 이 과정에서 Validation data를 사용해 hyperparameter를 튜닝하는 과정이 필요하다. (test data를 튜닝하는 과정에서 사용하면 안 됨)

 

데이터 수가 적은 경우에는 사이클을 돌면서 한 fold가 validation data가 되는 Cross-Validation이라는 방법을 사용해도 된다. 결괏값은 평균 결괏값을 사용하면 된다.

 

 

- K-Nearest Neighbor는 현실에서 사용하지 않는다.

1. test time이 너무 오래 걸려 사용하는 것에 제약이 크다.

2. distance가 현실적으로 정확한 예측을 할 수 없다. (동일한 distance를 가지면 같은 이미지임을 내포하고 있기 때문)

-> shifted image, messed up image, darkened image

 

 

- Linear Classification

파라미터 기반의 접근 방식을 취하고 있다. Nearest 방식은 non-parametric approach

W(weight)를 컨트롤 할 수 있다.

 

30720개의 weight

그래서 Linear Classifier는?

- Just a weighted sum of all the pixel values in the image

- counting colors at different spatial position

 

 

linear classifier로 학습된 weight의 시각화, 실제로 color에 dependent한 결과가 나오기도 함.

-> capacitiy에 한계가 있음.

 

Linear Classifier를 다음과 같이 표현할 수 도 있다.

 

Q linear classifier가 구분하기 힘든 종류의 데이터셋은 무엇이 있을까?

색상 반전 이미지, 흑백 이미지, 형태는 같지만 색상이 다른 경우..

반대로 위치가 다른 경우는 쉽게 구분이 가능할 것임.

 

따라서 지금까지 f(x_i, W, b) = Wx_i + b는 이미지를 score로 바꿔주는 일종의 (linear) score function이라고 볼 수 있다. 

앞으로 할 것은 이 score를 조정해주는 loss function을 정의해야 한다. 

문제설명

1. 입력이 빈 문자열인 경우, 빈 문자열을 반환합니다. 
2. 문자열 w를 두 "균형잡힌 괄호 문자열" u, v로 분리합니다. 단, u는 "균형잡힌 괄호 문자열"로 더 이상 분리할 수 없어야 하며, v는 빈 문자열이 될 수 있습니다. 
3. 문자열 u가 "올바른 괄호 문자열" 이라면 문자열 v에 대해 1단계부터 다시 수행합니다. 
  3-1. 수행한 결과 문자열을 u에 이어 붙인 후 반환합니다. 
4. 문자열 u가 "올바른 괄호 문자열"이 아니라면 아래 과정을 수행합니다. 
  4-1. 빈 문자열에 첫 번째 문자로 '('를 붙입니다. 
  4-2. 문자열 v에 대해 1단계부터 재귀적으로 수행한 결과 문자열을 이어 붙입니다. 
  4-3. ')'를 다시 붙입니다. 
  4-4. u의 첫 번째와 마지막 문자를 제거하고, 나머지 문자열의 괄호 방향을 뒤집어서 뒤에 붙입니다. 
  4-5. 생성된 문자열을 반환합니다.

"균형잡힌 괄호 문자열" p가 매개변수로 주어질 때, 주어진 알고리즘을 수행해 "올바른 괄호 문자열"로 변환한 결과를 return 하도록 solution 함수를 완성해 주세요.

 

 

문제 설명

문제설명

문제설명

문제설명

+ Recent posts