美文网首页
cs231n作业:Assignment1-KNN

cs231n作业:Assignment1-KNN

作者: Diane小山 | 来源:发表于2019-05-14 15:47 被阅读0次

    加载数据集

    # 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.shape)
    print('Training labels shape: ', y_train.shape)
    print('Test data shape: ', X_test.shape)
    print('Test labels shape: ', y_test.shape)
    

    结果:
    Training data shape: (50000, 32, 32, 3)
    Training labels shape: (50000,)
    Test data shape: (10000, 32, 32, 3)
    Test labels shape: (10000,)

    选择训练数据5000张,测试数据500张

    # Subsample the data for more efficient code execution in this exercise
    num_training = 5000
    mask = list(range(num_training))
    X_train = X_train[mask]
    y_train = y_train[mask]
    num_test = 500
    mask = list(range(num_test))
    X_test = X_test[mask]
    y_test = y_test[mask]
    

    并将32323的照片展开成3072。

    实现 compute_distances_two_loops

      def compute_distances_two_loops(self, X):
        """
        Compute the distance between each test point in X and each training point
        in self.X_train using a nested loop over both the training data and the
        test data.
     
        Inputs:
        - X: A numpy array of shape (num_test, D) containing test data.
     
        Returns:
        - dists: A numpy array of shape (num_test, num_train) where dists[i, j]
          is the Euclidean distance between the ith test point and the jth training
          point.
        """
        num_test = X.shape[0]
        num_train = self.X_train.shape[0]
        dists = np.zeros((num_test, num_train))
        for i in xrange(num_test):
          for j in range(num_train):
            
            #####################################################################
            # TODO:                                                             #
            # Compute the l2 distance between the ith test point and the jth    #
            # training point, and store the result in dists[i, j]. You should   #
            # not use a loop over dimension.                                    #
            #####################################################################
            dists[i][j] = np.sqrt(np.sum(np.square(self.X_train[j,:] - X[i,:])))
            #####################################################################
            #                       END OF YOUR CODE                            #
            #####################################################################
        return dists
    

    将dists画成图:


    visualize dists

    Inline Question #1:

    • What in the data is the cause behind the distinctly bright rows?
    • Answer: It means no train case is close to this test case, which indicates that it may be a noise.
    • What causes the columns?
    • Answer: No test case is close to this train case, which indicates that it may be a outlier.

    实现 compute_distances_one_loop

      def compute_distances_one_loop(self, X):
        """
        Compute the distance between each test point in X and each training point
        in self.X_train using a single loop over the test data.
     
        Input / Output: Same as compute_distances_two_loops
        """
        num_test = X.shape[0]
        num_train = self.X_train.shape[0]
        dists = np.zeros((num_test, num_train))
        for i in range(num_test):
          #######################################################################
          # TODO:                                                               #
          # Compute the l2 distance between the ith test point and all training #
          # points, and store the result in dists[i, :].                        #
          #######################################################################
          dists[i,:] = np.sqrt(np.sum(np.square(self.X_train-X[i,:]),axis = 1)) 
          # axis = 1 按行计算
          #######################################################################
          #                         END OF YOUR CODE                            #
          #######################################################################
        return dists
    

    实现classifier.compute_distances_no_loops

      def compute_distances_no_loops(self, X):
        """
        Compute the distance between each test point in X and each training point
        in self.X_train using no explicit loops.
     
        Input / Output: Same as compute_distances_two_loops
        """
        num_test = X.shape[0]
        num_train = self.X_train.shape[0]
        dists = np.zeros((num_test, num_train))
        #########################################################################
        # TODO:                                                                 #
        # Compute the l2 distance between all test points and all training      #
        # points without using any explicit loops, and store the result in      #
        # dists.                                                                #
        #                                                                       #
        # You should implement this function using only basic array operations; #
        # in particular you should not use functions from scipy.                #
        #                                                                       #
        # HINT: Try to formulate the l2 distance using matrix multiplication    #
        #       and two broadcast sums.                                         #
        #########################################################################
        dists = np.multiply(np.dot(X,self.X_train.T),-2) 
        sq1 = np.sum(np.square(X),axis=1,keepdims = True) 
        sq2 = np.sum(np.square(self.X_train),axis=1) 
        dists = np.add(dists,sq1)                               # python广播机制
        dists = np.add(dists,sq2) 
        dists = np.sqrt(dists)
        #########################################################################
        #                         END OF YOUR CODE                              #
        #########################################################################
        return dists
    

    Cross-validation

    num_folds = 5
    k_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.                                #
    ################################################################################
    X_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.                               #
    ################################################################################
    classifier = KNearestNeighbor()
    for k in k_choices:
        accuracies = []
        for fold in range(num_folds):
            temp_X = X_train_folds[:]                           # 先取整个的集
            temp_y = y_train_folds[:] 
            X_val_fold = temp_X.pop(fold)                       # 拿出一个当作val集
            y_val_fold = temp_y.pop(fold)
            temp_X = np.array([y for x in temp_X for y in x])   # 把训练集展开
            temp_y = np.array([y for x in temp_y for y in x])
            classifier.train(temp_X,temp_y)
            y_val_pred = classifier.predict(X_val_fold,k=k)
            num_correct = np.sum(y_val_fold == y_val_pred)
            accuracies.append(num_correct / y_val_fold.shape[0])
        k_to_accuracies[k] = accuracies
        
    ################################################################################
    #                                 END OF YOUR CODE                             #
    ################################################################################
    
    # Print out the computed accuracies
    for k in sorted(k_to_accuracies):
        for accuracy in k_to_accuracies[k]:
            print('k = %d, accuracy = %f' % (k, accuracy))
    

    画图:


    最后

    cs231n的作业很有含金量,好好做会有很大提高。加油吖 =)

    相关文章

      网友评论

          本文标题:cs231n作业:Assignment1-KNN

          本文链接:https://www.haomeiwen.com/subject/avgsaqtx.html