プログラマー人工知能Defcos第3期課程内容整理#25(cs 231 n assignment 1実習)

10718 ワード

今日は授業がなく、cs 231 nの課題の中で、私たちは最初のKNNの実習時間を持っています.
正式な実習前にNearest Neighborを知るために、以下のサイトを学びました.
http://aikorea.org/cs231n/classification/
画像分類(画像分類)
画像分類問題は、特定の画像を予め定められたクラスに分類する問題である.人間の立場では大したことではないが、コンピューターの観点から画像を見るのは難しいようだ.
最近接分類器(Nearest Neighbor Classifier)
この方法を実用性の低い分類器と呼ぶ.しかし、基本的な方法を理解するために、勉強することにしました.コードについて行きましょう.
Xtr, Ytr, Xte, Yte = load_CIFAR10('data/cifar10/') # 제공되는 함수
# 모든 이미지가 1차원 배열로 저장된다.
Xtr_rows = Xtr.reshape(Xtr.shape[0], 32 * 32 * 3) # Xtr_rows는 50000 x 3072 크기의 배열.
Xte_rows = Xte.reshape(Xte.shape[0], 32 * 32 * 3) # Xte_rows는 10000 x 3072 크기의 배열.
nn = NearestNeighbor() # Nearest Neighbor 분류기 클래스 생성
nn.train(Xtr_rows, Ytr) # 학습 이미지/라벨을 활용하여 분류기 학습
Yte_predict = nn.predict(Xte_rows) # 테스트 이미지들에 대해 라벨 예측
# 그리고 분류 성능을 프린트한다
# 정확도는 이미지가 올바르게 예측된 비율로 계산된다 (라벨이 같을 비율)
print 'accuracy: %f' % ( np.mean(Yte_predict == Yte) )
import numpy as np

class NearestNeighbor(object):
  def __init__(self):
    pass

  def train(self, X, y):
    """ X is N x D where each row is an example. Y is 1-dimension of size N """
    # nearest neighbor 분류기는 단순히 모든 학습 데이터를 기억해둔다.
    self.Xtr = X
    self.ytr = y

  def predict(self, X):
    """ X is N x D where each row is an example we wish to predict label for """
    num_test = X.shape[0]
    # 출력 type과 입력 type이 갖게 되도록 확인해준다.
    Ypred = np.zeros(num_test, dtype = self.ytr.dtype)

    # loop over all test rows
    for i in range(num_test):
      # i번째 테스트 이미지와 가장 가까운 학습 이미지를
      # L1 거리(절대값 차의 총합)를 이용하여 찾는다.
      # broadcasting 연산을 이해하는 것이 필요하다.
      # Xtr이 50000 * 3072이고 X[i]가 1 * 3072이다. 따라서 연산을 하면 50000 * 3072 행렬이 나온다.
      # 여기에서 sum을 axis=1방향으로 해주었기에
      # 각 행을 더한 값들이 나열된 1 * 50000의 array가 나온다.
      distances = np.sum(np.abs(self.Xtr - X[i,:]), axis = 1)
      min_index = np.argmin(distances) # 가장 작은 distance를 갖는 인덱스를 찾는다.
      Ypred[i] = self.ytr[min_index] # 가장 가까운 이웃의 라벨로 예측

    return Ypred
上記の例では、L 1 distanceを用いたが、L 2 distanceを用いてもよい.
#Xtr - X[i]는 50000 * 3072
#np.square는 각 요소의 값을 제곱한다.
#따라서 (a-b)^2의 요소들이 50000 * 3072이다.
distances = np.sqrt(np.sum(np.square(self.Xtr - X[i,:]), axis = 1))
k-Nearest Neighbor(kNN)分類器
1−NNの最大の問題は訓練誤差が低いことではなく,試験誤差が高いことである.投票はある画像を分類するためだと仮定します.そのイメージカテゴリで最高投票を獲得したのはdogであり、2,3,4,5などの投票がcatであれば、そのイメージをdogに分類する可能性が高い.
クロス検証の使用
HyperParameterが調整した検証セット(Validation Set)としてクロス検証を利用することができます.
現在、学んだ内容をもとにした正式実習課程はプロジェクトラベルに整理されている.