def test_KNN_train(sample_train, sample_test): #this test is designed to verify that input shapes are correct Xtrain, ytrain = sample_train(count=40) Xtest, ytest = sample_test(count=10) with pytest.raises(ValueError): knn = KNearestNeighbor() knn.train(Xtrain, ytrain)
def test_KNN_train_reshape_input(sample_train, sample_test): Xtrain, ytrain = sample_train(count=40) Xtest, ytest = sample_test(count=10) Xtrain = np.reshape(Xtrain, (Xtrain.shape[0], -1)) Xtest = np.reshape(Xtest, (Xtest.shape[0], -1)) knn = KNearestNeighbor() knn.train(Xtrain,ytrain)
def test_KNN_dists_noloop_shape(sample_train, sample_test, in_count): Xtrain, ytrain = sample_train(count=in_count) Xtest, ytest = sample_test(count=in_count-30) Xtrain = np.reshape(Xtrain, (Xtrain.shape[0], -1)) Xtest = np.reshape(Xtest, (Xtest.shape[0], -1)) knn = KNearestNeighbor() knn.train(Xtrain,ytrain) assert knn.compute_distances_no_loops(Xtest).shape == (Xtest.shape[0], Xtrain.shape[0])
def test_KNN_predict_loop_parameter(sample_train, sample_test, k, num_loops): Xtrain, ytrain = sample_train(count=40) Xtest, ytest = sample_test(count=10) Xtrain = np.reshape(Xtrain, (Xtrain.shape[0], -1)) Xtest = np.reshape(Xtest, (Xtest.shape[0], -1)) knn = KNearestNeighbor() knn.train(Xtrain,ytrain) assert knn.predict(Xtest,k,num_loops).shape == ytest.shape
def test_KNN_predict_incorrect_shape(sample_train, sample_test): Xtrain, ytrain = sample_train(count=500) Xtest, ytest = sample_test(count=125) Xtrain = np.reshape(Xtrain, (Xtrain.shape[0], -1)) Xtest = np.reshape(Xtest, (Xtest.shape[0], -1)) knn = KNearestNeighbor() knn.train(Xtrain,ytrain) with pytest.raises(ValueError): knn.predict(ytrain)#using ytrain, shich has incorrect dimensions;
def test_KNN_predict_num_loop_parameter(sample_train, sample_test, num_loops): Xtrain, ytrain = sample_train(count=40) Xtest, ytest = sample_test(count=10) Xtrain = np.reshape(Xtrain, (Xtrain.shape[0], -1)) Xtest = np.reshape(Xtest, (Xtest.shape[0], -1)) knn = KNearestNeighbor() knn.train(Xtrain,ytrain) with pytest.raises(ValueError): knn.predict(Xtest,0,num_loops).shape
def test_KNN_dists_one_to_none(sample_train, sample_test): Xtrain, ytrain = sample_train(count=40) Xtest, ytest = sample_test(count=10) Xtrain = np.reshape(Xtrain, (Xtrain.shape[0], -1)) Xtest = np.reshape(Xtest, (Xtest.shape[0], -1)) knn = KNearestNeighbor() knn.train(Xtrain,ytrain) dist_one = knn.compute_distances_one_loop(Xtest) dist_no = knn.compute_distances_no_loops(Xtest) assert np.linalg.norm(dist_one - dist_no, ord='fro') < 0.001
def test_KNN_predict_labels_shape(sample_train, sample_test): Xtrain, ytrain = sample_train(count=40) Xtest, ytest = sample_test(count=10) Xtrain = np.reshape(Xtrain, (Xtrain.shape[0], -1)) Xtest = np.reshape(Xtest, (Xtest.shape[0], -1)) knn = KNearestNeighbor() knn.train(Xtrain,ytrain) dist_no = knn.compute_distances_no_loops(Xtest) assert knn.predict_labels(dist_no, k=1).shape == ytest.shape assert knn.predict_labels(dist_no, k=2).shape == ytest.shape assert knn.predict_labels(dist_no, k=3).shape == ytest.shape assert knn.predict_labels(dist_no, k=4).shape == ytest.shape
num_test = 500 mask = list(range(num_test)) X_test = X_test[mask] y_test = y_test[mask] # Reshape the image data into rows X_train = np.reshape(X_train, (X_train.shape[0], -1)) X_test = np.reshape(X_test, (X_test.shape[0], -1)) print(X_train.shape, X_test.shape) from cs231n.classifiers.k_nearest_neighbor import KNearestNeighbor # Create a kNN classifier instance. # Remember that training a kNN classifier is a noop: # the Classifier simply remembers the data and does no further processing classifier = KNearestNeighbor() classifier.train(X_train, y_train) """ dists = classifier.compute_distances_two_loops(X_test) pickle.dump(dists,open(r"D:\python\CS231n\assignment1\tmp.txt","wb")) print(dists.shape) print(dists) plt.imshow(dists, interpolation='none') plt.show() """ with open(r"D:\python\CS231n\assignment1\tmp.txt", "rb") as file: dists = pickle.load(file) y_test_pred = classifier.predict_labels(dists, k=1) # Compute and print the fraction of correctly predicted examples
num_test = 500 mask = list(range(num_test)) X_test = X_test[mask] y_test = y_test[mask] # Reshape the image data into rows X_train = np.reshape(X_train, (X_train.shape[0], -1)) X_test = np.reshape(X_test, (X_test.shape[0], -1)) print(X_train.shape, X_test.shape) from cs231n.classifiers.k_nearest_neighbor import KNearestNeighbor # Create a kNN classifier instance. # Remember that training a kNN classifier is a noop: # the Classifier simply remembers the data and does no further processing classifier = KNearestNeighbor() classifier.train(X_train, y_train) # Open cs231n/classifiers/k_nearest_neighbor.py and implement # compute_distances_two_loops. # Test your implementation: dists = classifier.compute_distances_two_loops(X_test) # We can visualize the distance matrix: each row is a single test example and # its distances to training examples plt.imshow(dists, interpolation='none') plt.show() # Now implement the function predict_labels and run the code below: # We use k = 1 (which is Nearest Neighbor).
# Split the arrays into individual folds X_train_folds = np.split(X_train, num_folds) y_train_folds = np.split(y_train, num_folds) # Dictionary holding the accuracies (list) for different values of k k_to_accuracies = {} # k-fold cross validation using fold i as validation, and all others as training for choice in k_choices: for i in range(num_folds): # Partition training and test arrays X_tr = np.vstack([X_train_folds[x] for x in range(num_folds) if x!=i]) y_tr = np.hstack([y_train_folds[x] for x in range(num_folds) if x!=i]) X_te = X_train_folds[i] y_te = y_train_folds[i] # Create kNN classifier instance clf = KNearestNeighbor() clf.train(X_tr, y_tr) # Predict pred = clf.predict(X_te, k=choice) acc = float(np.sum(pred == y_te)) / y_te.shape[0] print(f"k = {choice}, accuracy = {acc}") if i == 0: k_to_accuracies[choice] = [acc] else: k_to_accuracies[choice].append(acc) # Plot results for k in k_choices: accs = k_to_accuracies[k] plt.scatter([k] * len(accs), accs) # Plot trend line with error bars corresponding to standard deviation