Q1: k-Nearest Neighbor classifier
knn.ipynb
# Load the raw CIFAR-10 data.cifar10_dir = 'cs231n/datasets/cifar-10-batches-py'X_train, y_train, X_test, y_test = load_CIFAR10(cifar10_dir)# As a sanity check, we PRint out the size of the training and test data.print 'Training data shape: ', X_train.shapeprint 'Training labels shape: ', y_train.shapeprint 'Test data shape: ', X_test.shapeprint 'Test labels shape: ', y_test.shapeTraining data shape: (50000, 32, 32, 3) Training labels shape: (50000,) Test data shape: (10000, 32, 32, 3) Test labels shape: (10000,)
# Visualize some examples from the dataset. # We show a few examples of training images from each class. classes = ['plane', 'car', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck'] num_classes = len(classes) samples_per_class = 7 for y, cls in enumerate(classes): idxs = np.flatnonzero(y_train == y) idxs = np.random.choice(idxs, samples_per_class, replace=False) for i, idx in enumerate(idxs): plt_idx = i * num_classes + y + 1 plt.subplot(samples_per_class, num_classes, plt_idx) plt.imshow(X_train[idx].astype('uint8')) plt.axis('off') if i == 0: plt.title(cls) plt.show()
# We can visualize the distance matrix: each row is a single test example and# its distances to training examplesplt.imshow(dists, interpolation='none')plt.show()
Got 137 / 500 correct => accuracy: 0.274000 Got 139 / 500 correct => accuracy: 0.278000
Difference was: 0.000000 Good! The distance matrices are the same
Difference was: 0.000000 Good! The distance matrices are the same
Two loop version took 34.064844 seconds One loop version took 49.805297 seconds No loop version took 0.328161 seconds
Cross-Validation
num_folds = 5k_choices = [1, 3, 5, 8, 10, 12, 15, 20, 50, 100]X_train_folds = []y_train_folds = []################################################################################# TODO: ## Split up the training data into folds. After splitting, X_train_folds and ## y_train_folds should each be lists of length num_folds, where ## y_train_folds[i] is the label vector for the points in X_train_folds[i]. ## Hint: Look up the numpy array_split function. #################################################################################passX_train_folds = np.array_split(X_train, num_folds)y_train_folds = np.array_split(y_train, num_folds)################################################################################# END OF YOUR CODE ################################################################################## A dictionary holding the accuracies for different values of k that we find# when running cross-validation. After running cross-validation,# k_to_accuracies[k] should be a list of length num_folds giving the different# accuracy values that we found when using that value of k.k_to_accuracies = {}################################################################################# TODO: ## Perform k-fold cross validation to find the best value of k. For each ## possible value of k, run the k-nearest-neighbor algorithm num_folds times, ## where in each case you use all but one of the folds as training data and the ## last fold as a validation set. Store the accuracies for all fold and all ## values of k in the k_to_accuracies dictionary. #################################################################################passfor k in k_choices: accuracies = [] for i in range(num_folds): X_train_cv = np.vstack(X_train_folds[0:i]+X_train_folds[i+1:]) X_test_cv = X_train_folds[i] y_train_cv = np.hstack(y_train_folds[0:i]+y_train_folds[i+1:]) #size:4000 y_test_cv = y_train_folds[i] classifier.train(X_train_cv,y_train_cv) dists = classifier.compute_distances_no_loops(X_test_cv) y_test_pred = classifier.predict_labels(dists, k) num_correct = np.sum(y_test_pred == y_test_cv) accuracy = float(num_correct) / num_test accuracies.append(accuracy) k_to_accuracies[k] = accuracies################################################################################# END OF YOUR CODE ################################################################################## Print out the computed accuraciesfor k in sorted(k_to_accuracies): for accuracy in k_to_accuracies[k]: print 'k = %d, accuracy = %f' % (k, accuracy)k = 1, accuracy = 0.526000 k = 1, accuracy = 0.514000 k = 1, accuracy = 0.528000 k = 1, accuracy = 0.556000 k = 1, accuracy = 0.532000 k = 3, accuracy = 0.478000 k = 3, accuracy = 0.498000 k = 3, accuracy = 0.480000 k = 3, accuracy = 0.532000 k = 3, accuracy = 0.508000 k = 5, accuracy = 0.496000 k = 5, accuracy = 0.532000 k = 5, accuracy = 0.560000 k = 5, accuracy = 0.584000 k = 5, accuracy = 0.560000 k = 8, accuracy = 0.524000 k = 8, accuracy = 0.564000 k = 8, accuracy = 0.546000 k = 8, accuracy = 0.580000 k = 8, accuracy = 0.546000 k = 10, accuracy = 0.530000 k = 10, accuracy = 0.592000 k = 10, accuracy = 0.552000 k = 10, accuracy = 0.568000 k = 10, accuracy = 0.560000 k = 12, accuracy = 0.520000 k = 12, accuracy = 0.590000 k = 12, accuracy = 0.558000 k = 12, accuracy = 0.566000 k = 12, accuracy = 0.560000 k = 15, accuracy = 0.504000 k = 15, accuracy = 0.578000 k = 15, accuracy = 0.556000 k = 15, accuracy = 0.564000 k = 15, accuracy = 0.548000 k = 20, accuracy = 0.540000 k = 20, accuracy = 0.558000 k = 20, accuracy = 0.558000 k = 20, accuracy = 0.564000 k = 20, accuracy = 0.570000 k = 50, accuracy = 0.542000 k = 50, accuracy = 0.576000 k = 50, accuracy = 0.556000 k = 50, accuracy = 0.538000 k = 50, accuracy = 0.532000 k = 100, accuracy = 0.512000 k = 100, accuracy = 0.540000 k = 100, accuracy = 0.526000 k = 100, accuracy = 0.512000 k = 100, accuracy = 0.526000

Got 141 / 500 correct => accuracy: 0.282000