L

LONZARK

V1

2023/03/19阅读：4主题：默认主题

# CS | 231n Notes

• Image Classification
• Nearest Neighbor Classifier
• k- Nearest Neighbor Classifier
• Validation sets for Hyperparameter tuning
• Summary
• Summary:Apply kNN in practice

# Image Classification

Motivation & Example

Challenges

Data-driven approach

The image classification pipeline.

# Nearest Neighbor Classifier

code

``Xtr, Ytr, Xte, Yte = load_CIFAR10('data/cifar10/') # a magic function we provide# flatten out all images to be one-dimensionalXtr_rows = Xtr.reshape(Xtr.shape, 32 * 32 * 3) # Xtr_rows becomes 50000 x 3072Xte_rows = Xte.reshape(Xte.shape, 32 * 32 * 3) # Xte_rows becomes 10000 x 3072``
``import numpy as npclass 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 """    # the nearest neighbor classifier simply remembers all the training data    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    # lets make sure that the output type matches the input type    Ypred = np.zeros(num_test, dtype = self.ytr.dtype)    # loop over all test rows    for i in range(num_test):      # find the nearest training image to the i'th test image      # using the L1 distance (sum of absolute value differences)      distances = np.sum(np.abs(self.Xtr - X[i,:]), axis = 1)      min_index = np.argmin(distances) # get the index with smallest distance      Ypred[i] = self.ytr[min_index] # predict the label of the nearest example    return Ypred``
``distances = np.sqrt(np.sum(np.square(self.Xtr - X[i,:]), axis = 1))``

# Validation sets for Hyperparameter tuning

The idea is that instead of arbitrarily picking the first 1000 datapoints to be the validation set and rest training set, you can get a better and less noisy estimate of how well a certain value of k works by iterating over different validation sets and averaging the performance across these.

``# assume we have Xtr_rows, Ytr, Xte_rows, Yte as before# recall Xtr_rows is 50,000 x 3072 matrixXval_rows = Xtr_rows[:1000, :] # take first 1000 for validationYval = Ytr[:1000]Xtr_rows = Xtr_rows[1000:, :] # keep last 49,000 for trainYtr = Ytr[1000:]# find hyperparameters that work best on the validation setvalidation_accuracies = []for k in [1, 3, 5, 10, 20, 50, 100]:  # use a particular value of k and evaluation on validation data  nn = NearestNeighbor()  nn.train(Xtr_rows, Ytr)  # here we assume a modified NearestNeighbor class that can take a k as input  Yval_predict = nn.predict(Xval_rows, k = k)  acc = np.mean(Yval_predict == Yval)  print 'accuracy: %f' % (acc,)  # keep track of what works on the validation set  validation_accuracies.append((k, acc))``

pros and cons of Nearest Neighbor classifier

L
V1