- 17-55
- 전시
- fdr-x3000
- 글로벌소프트웨어캠퍼스
- 시청
- 맛집
- 수요미식회
- 전주
- 대만여행
- ai_엔지니어링
- 여행
- 650d
- 건담
- 카페
- 제주도
- 우리에프아이에스
- 군산
- 해리포터
- SQL
- 축복렌즈
- CS231n
- k-디지털트레이닝
- 우리fisa
- 우리fis아카데미
- 도쿄
- 사진
- 축복이
- 대만
- 오사카
- Python
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- Today
- Total
브렌쏭의 Veritas_Garage
[CS231n] #2. 이미지 분류(1) 본문
Assignment
- K-Nearest Neighbor 구현
- Linear Classifiers: SVM, Softmax 적용하기
- Two-layer neural network
- Image features
CS231n Convolutional Neural Networks for Visual Recognition
이 링크에서 모든 과제 관련 정보를 얻을 수 있다.
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는 당연히 홀수로 넣어야 50:50으로 판단할수없는 헛짓거리를 피할수 있겠죠?
Hyper Parameter
위에서 K 의 값과 같은 요소는 정답이 있는 것이 아니라 사용자가 임의로 지정해줘야 하는 것인데
하이퍼 파라미터라고 부른다.
결론적으로는 '적당히', '적절한' 값을 넣는 것이 좋은데, 어떻게 그 좋은 값을 찾아낼까
Hyper parameter : 훈련할 데이터, 검증할 데이터, 실제로 테스트할 데이터
모의고사에서 날고 기어도 실전에서 노답이면 애초에 써먹을 수가 없으므로, 훈련데이터로 예측률을 100% 가까이 올리는 것은 무의미하다.
1. 훈련을 시킨 뒤에 실제 실전 테스트 데이터를 제공해 거기에서 좋은 결과를 낸 파라미터로 정한다
2. 훈련 뒤에 검증용 데이터로 실전같은 모의고사를 치루고 가장 좋은 성적의 파라미터를 지정한 뒤, 실전에 한번만 투입한다
+ Cross validation)
- 코호트 연구마냥 나눠서 검증하는 방식
'[Project_하다] > [Project_공부]' 카테고리의 다른 글
[CS231n] #4. Neural Network (1) | 2024.07.01 |
---|---|
[CS231n] #3. Loss Function, 최적화 (0) | 2024.06.28 |
[CS231n] #2. 이미지 분류(2) (0) | 2024.06.27 |
[CS231n] #1. Computer Vision의 역사 (0) | 2024.06.26 |
정중함, 회사는 유치원은 아니나, 옥타곤도 아니므로 (1) | 2022.07.21 |
업무의 일환 :: 기능 명세, ERD 그리고 Git Branch(조금) (0) | 2022.05.06 |
Kubernetes :: 쿠버네티스 :: K8s (0) | 2022.05.03 |