cs231n assignment1 knn

斯坦福cs231n——assignment1_KNN 全称K-最近邻算法,找到最近的k个邻居,在选取到的k个样本中选取出最近的且占比最高的类别作为预测类别,因此可以看做一种,依赖少数服从多数的原则,属于局部近似。优点:1、简单训练快;2、据周围邻近样本的标签进行分类的,所以适合于样本类别交叉或重叠较多的情况;3、对异常值不敏感;缺点:1、计算量大预测慢;2、无法解决高维问题;3、当不同类别的样本数目差异较大时,数目较大的那一类别对KNN判别结果影响较大,因此可能产生误判;4、不存在概率评分,仅根据样本标签判别; 阅读详情

最近开始学习CS231N课程,还是通过自己的理解,将编程中问题或者重点进行记录。

准备阶段

对比了历年CS231N开课情况,发现从2017春季课程开始后,每一年的assignment都没有发生变化,故以下记录都是适用所有作业的。

首先,根据2019年cs231n课程的准备指导,将代码和数据先下载下来。随后,使用jupyter notebook进行编辑。

所谓磨刀不误砍柴工,在进行作业前,建议花一点时间将numpy库、matplotlib库的使用方法进行阅读,链接:Python Numpy Tutorial


本次作业分为五个部分:knn、SVM、Softmax classifier、2层神经网络、Higher Level Representations: Image Features。

k-Nearest Neighbor classifier

通过阅读knn文件,可以知道在knn中调用了k_nearest_neighbor.py文件,第一部分首先完成两重循环计算测试集数据到训练集数据的欧式距离。

k_nearest_neighbor.py中的compute_distances_two_loops(self, X)函数

	for i in range(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, nor use np.linalg.norm().          #
                #####################################################################
                # *****START OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)*****
                
                # 使用numpy库对两个向量进行欧几里得距离计算
                dists[i,j] = np.sqrt(np.sum(np.square(X[i] - self.X_train[j])))
                pass

                # *****END OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)*****

通过之前的学习,可以使用numpy进行代码完成,在这里我是偷了懒,将代码写成了一行,但是我相信这段代码还是很好理解的。首先在两重循环中将测试集和训练集各一行向量通过减法运算后,平方,然后求和,最后开根号,这样就完成了欧式距离计算,运行结果如图:
在这里插入图片描述

嵌入在knn文件中的思考问题见最后。


接下来,继续阅读knn代码,可以看到第二部分需要完成的是预测函数predict_labels()
首先,在for循环中,选择与第i个点最近的k个元素的下标,并找到其对应训练数据集的分类值。然后选择出现类别最高的一个元素作为预测分类。

使用到了几个新的函数,具体使用方法见注释。
k_nearest_neighbor.py中的predict_labels()函数 [只展示for循环]

	for i in range(num_test):
            # A list of length k storing the labels of the k nearest neighbors to
            # the ith test point.
            closest_y = []
            #########################################################################
            # TODO:                                                                 #
            # Use the distance matrix to find the k nearest neighbors of the ith    #
            # testing point, and use self.y_train to find the labels of these       #
            # neighbors. Store these labels in closest_y.                           #
            # Hint: Look up the function numpy.argsort.                             #
            #########################################################################
            # *****START OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)*****
            # 找到最小的k个值的下标
            min_idxs = np.argsort(dists[i])[0:k]
            # 选择训练数据标签的值
            closest_y = self.y_train[min_idxs]
            
            pass

            # *****END OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)*****
            #########################################################################
            # TODO:                                                                 #
            # Now that you have found the labels of the k nearest neighbors, you    #
            # need to find the most common label in the list closest_y of labels.   #
            # Store this label in y_pred[i]. Break ties by choosing the smaller     #
            # label.                                                                #
            #########################################################################
            # *****START OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)*****
            
            # 使用np.bincount()和np.argmax()函数来实现
            # np.bincount()返回一个列表,每一位值为Yi,意思是i这个数在列表中出现的次数为Yi次。
            # np.argmax()返回列表中最大值的下标
            y_pred[i] = np.argmax(np.bincount(closest_y))
            
            pass

接下来实现一重循环计算距离。需要注意的是,内层循环去掉后,只能直接对x_train操作,需要注意求和时,注明求和的纬度。
例如np.sum(X,axis= 1)是在行维度上进行求和,即把每一行加起来;np.sum(X , axis = 0)是在列维度上进行求和,即把每一列加起来。

k_nearest_neighbor.py中的compute_distances_one_loops(self, X)函数 [只展示for循环]

	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, :].                        #
            # Do not use np.linalg.norm().                                        #
            #######################################################################
            # *****START OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)*****
            
            # 求和是需注意,这次是对列纬度上的求和,即把每一列加起来后再开根号
            dists[i,:] = np.sqrt(np.sum(((X[i,:] - self.X_train) ** 2 ) , axis=1))
            pass

接下来实现完全向量化代码,不得不说这部分实现起来和matlab不一样,原因在于numpy引入了broadcast机制,简单说就是当操作的元素维度不匹配时,广播机制开始将一个矩阵向着维度更多的矩阵填充。具体可参考这篇文章:https://www.runoob.com/numpy/numpy-broadcast.html

k_nearest_neighbor.py中的compute_distances_no_loops(self, X)函数

# 要计算L2距离,使用向量化代码,则只能将完全平方项展开,然后加起来
# 其中乘法部分注意维度
# 使用reshape触发broadcast
dists += np.sum(X ** 2, axis=1).reshape(num_test,1)
dists += np.sum(self.X_train ** 2, axis=1).reshape(1,num_train)
dists -= 2 * np.dot(X, self.X_train.T)
dists = np.sqrt(dists)
pass

最后是三种方式的时间比较,可以看出完全向量化代码的效率是最高的,因为使用线性代数的方式进行计算,这些库都做了非常好的优化,甚至可以在多核CPU上并行执行。
在这里插入图片描述


接下来是在knn文件中,测试不同k值时,何时效果最好。这部分代码有点难,首先将是循环所有的k,并在每一次循环中再循环num_folds次,把数据集中的“一份”数据作为交叉验证集,其余作为训练集。

代码如下
knn.ipynb

# *****START OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)*****
# 将原始数据分为5份
X_train_folds = np.array_split(X_train,num_folds)
y_train_folds = np.array_split(y_train,num_folds)
pass

# *****END OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)*****


# 中间已给出的代码省略

# *****START OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)*****
# 循环每一个k
for k in k_choices:
    # 将字典值部分初始化为一个大小为num_folds的数组
    k_to_accuracies[k] = np.zeros(num_folds)
    acc = []
    for i in range(num_folds):
        # 把第i个空出来,作为cv集
        X_tr = X_train_folds[0:i] + X_train_folds[i+1:]
        y_tr = y_train_folds[0:i] + y_train_folds[i+1:]
        # 使用concatenate将4个训练集拼在一起,axis=0可以省略
        X_tr = np.concatenate(X_tr,axis=0)
        y_tr = np.concatenate(y_tr,axis=0)
        # 第i个为cv集
        X_cv = X_train_folds[i]
        y_cv = y_train_folds[i]
        
        
        classifier = KNearestNeighbor()
        # 将训练数据保存
        classifier.train(X_tr,y_tr)
        # 计算距离矩阵,使用cv集合
        dists = classifier.compute_distances_no_loops(X_cv)
        # 预测结果
        y_cv_pred = classifier.predict_labels(dists,k=k)
        # 计算准确率
        num_correct = np.mean(y_cv_pred == y_cv)
        
        acc.append(num_correct)
    k_to_accuracies[k] = acc
pass

# *****END OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)*****

Inline Question

Inline Question 1
在这里插入图片描述

Notice the structured patterns in the distance matrix, where some rows or columns are visible brighter. (Note that with the default color scheme black indicates low distances while white indicates high distances.)

  • What in the data is the cause behind the distinctly bright rows?
  • What causes the columns?

我的答案:

  • 白色的点表示测试集和训练集中对应的两幅图片非常的不相似,而白色的横线(或竖线)则是测试集(或训练集)中对应的图片恰好与训练集(或测试集)中对应的图片非常不相似。

Inline Question 2
We can also use other distance metrics such as L1 distance.
For pixel values p i j ( k ) p_{ij}^{(k)} pij(k)​ at location ( i , j ) (i,j) (i,j) of some image I k I_k Ik​,

the mean μ \mu μ across all pixels over all images is μ = 1 n h w ∑ k = 1 n ∑ i = 1 h ∑ j = 1 w p i j ( k ) \mu=\frac{1}{nhw}\sum_{k=1}^n\sum_{i=1}^{h}\sum_{j=1}^{w}p_{ij}^{(k)} μ=nhw1​k=1∑n​i=1∑h​j=1∑w​pij(k)​
And the pixel-wise mean μ i j \mu_{ij} μij​ across all images is
μ i j = 1 n ∑ k = 1 n p i j ( k ) . \mu_{ij}=\frac{1}{n}\sum_{k=1}^np_{ij}^{(k)}. μij​=n1​k=1∑n​pij(k)​.
The general standard deviation σ \sigma σ and pixel-wise standard deviation σ i j \sigma_{ij} σij​ is defined similarly.

Which of the following preprocessing steps will not change the performance of a Nearest Neighbor classifier that uses L1 distance? Select all that apply.

  1. Subtracting the mean μ \mu μ ( p ~ i j ( k ) = p i j ( k ) − μ \tilde{p}_{ij}^{(k)}=p_{ij}^{(k)}-\mu p~​ij(k)​=pij(k)​−μ.)
  2. Subtracting the per pixel mean μ i j \mu_{ij} μij​ ( p ~ i j ( k ) = p i j ( k ) − μ i j \tilde{p}_{ij}^{(k)}=p_{ij}^{(k)}-\mu_{ij} p~​ij(k)​=pij(k)​−μij​.)
  3. Subtracting the mean μ \mu μ and dividing by the standard deviation σ \sigma σ.
  4. Subtracting the pixel-wise mean μ i j \mu_{ij} μij​ and dividing by the pixel-wise standard deviation σ i j \sigma_{ij} σij​.
  5. Rotating the coordinate axes of the data.

Y o u r A n s w e r : \color{blue}{\textit Your Answer:} YourAnswer:(个人理解,有不对的地方希望大家纠正)
1 , 3

Y o u r E x p l a n a t i o n : \color{blue}{\textit Your Explanation:} YourExplanation:
1:将每一个像素减去同一个平均值,故L1距离不会发生任何变化,故性能不变。
2:将每一个像素减去不同图片像素 的平均值,L1距离势必发生变化。
3:同1,减去同一个平均值后,再处以同一个标准差,距离的比例不变,故不影响L1的性能。
4:同2,L1距离势必发生变化。
5:当坐标轴发生旋转时,只有L2距离不会发生变化,L1距离会变化,参考文章:链接

Inline Question 3
Which of the following statements about k k k-Nearest Neighbor ( k k k-NN) are true in a classification setting, and for all k k k? Select all that apply.

  1. The decision boundary of the k-NN classifier is linear.
  2. The training error of a 1-NN will always be lower than that of 5-NN.
  3. The test error of a 1-NN will always be lower than that of a 5-NN.
  4. The time needed to classify a test example with the k-NN classifier grows with the size of the training set.
  5. None of the above.

Y o u r A n s w e r : \color{blue}{\textit Your Answer:} YourAnswer:
4

Y o u r E x p l a n a t i o n : \color{blue}{\textit Your Explanation:} YourExplanation:
1:显然不一定是线性
2:不一定吧
3:不一定吧
4:训练集越大,耗时越多,正确


参考文章
Solutions to Stanford’s CS 231n Assignments 1 Inline Problems: KNN
参考代码文章1
参考代码文章2


下一篇:cs231n assignment1 SVM

cs231n作业 assignment 1 q1 q2 q3 请先看课程作业地址。有两种做作业的方法,一种是在google Colab上做 (需魔法),另一种就是下载到本地,但是我懒得在本地配置环境,太麻烦了,还得修改一些基础代码,我就直接在google colab上做了google colab 配置环境只需要跟着教程走就好了最后还有一题解答题懒得做的,这个题目做的没啥意思。让我们用简单写法来实现softmax的loss函数与梯度计算。 阅读详情

相关推荐

cs231n Assignment 1# SVM详细答案及总结

Assignment 1# SVM线性分类器简介:score function:loss function 线性分类器简介: 在这里的两个分类器SVM和softmax都是线性分类器,也是后序神经网络的基础。他由两部分组成:score function和loss function。 前者通过WTx+bW^Tx+bWTx+b的线性方式计算出每一个图片向量对于不同类别的得分,后者则采用不同的loss对误差进行度量(SVM or softmax)。 score function: 对于一张高维的图片,首先还是将它伸

i_csdn_water的博客 1616

CS231n-assignment1详解

博客中的一部分公式和图片无法展示,建议移步至GitHub中。assignment1中有一个assignment.pdf,这个就是本文导出的pdf版本。 Github传送门 1. 配置问题 考虑到很多朋友使用Windows系统(包括我这个VegetableBird…),这就直接导致数据集无法通过官网所给的教程下载,因此这里首先要解决作业的配置问题。 想要运行官网上的那段命令,第一步需要下载数据集。点击这里进行下载。下载后不需要解压,将这个压缩包放在Assignment1/CS231n/datasets目录下。

IMDASHUAI的博客 5970

CS231N Assignment1 KNN

在上图的compute_distances_two_loops() 函数中,我们需要实现计算每张测试图像(如500张)与每张训练图像(如5000张)之间的L2距离,并返回一个500*5000的二维数组dists,dists[i,j]是第i张测试图像与第j张训练图像之间的L2距离 我们有L2距离的计算公式如下: 即两张图像的L2距离等于他们每个对应像素值之差的平方的累加值开根号 dists[i]...

沉剑池 1169

CS231n -Assignments 1 Q1 and Q2

前言 最近在youtube 上学习CS231n的课程,并尝试完成Assgnments,收获很多,这里记录下过程和结果以及过程中遇到的问题,我并不是只是完成需要补充的代码段,对于自己不熟悉的没用过的库函数查了官方文档,并做了注释, 每个Assignments 完成后,我会将代码会放到我的GitHub。Assignments 1 is here 在本地完成,需要...

weixin_30339457的博客 421

cs231n-assignment1-knn

之前准备把所有的问题都写在一个博客里面,我发现实在太长了,所以就把作业一的问题都分开了! part0:环境的安装和配置 part1:KNN, part2:SVM part3:softmax part4:two_layer_net part5:feature KNN 现在就part1进行解释与说明: 一、建议写之前先阅读下面的材料:http://cs231n.git

coder 535

cs231n assignment1_Q1_KNN Classifier

今天开始将进行学习cs231n课程并完成相关的作业,在此记录。 配置环境 首先在做作业之前,需要配置作业相关的环境才能进行,我的步骤如下: 下载并安装anaconda:https://www.anaconda.com/download/ ,这是一个Python的科学包,它集成了很多机器学习、深度学习要用的相关库,也自带了一个Python。 安装Jupyter notebook,直接可以在命令行安...

Sean_csy的博客 2146

CS231n:assignment1 KNN

CS231n:assignment1 KNN一、前言二、主要部分程序解读1、数据输入2、数据更新3、KNN分类器实现  3.1 训练分类器  3.1 计算欧式距离L2 一、前言 KNN属于无监督学习,也是整个机器学习中最简单粗暴一种,程序实现也非常容易。     kNN分类器分为两个阶段: 在训练过程中,分类器获取训...

Raywit的博客 5871

CS231N—KNN assignment1

然后对这 K 张图像的所属类别进行计数(可能有两张是狗,三张是猫),取出现次数最多的类别作为这张测试图像的类别(即出现三次的猫)。对于输入的每一张测试图像,与分类器中储存的每一张训练图像分别计算一次距离,这个距离可以是L1 distance(曼哈顿距离)或者是L2 distance(欧式距离)等。其中,test[i]表示测试集中的第i张图像,test[i][k]表示测试集中第i张图像的第k个像素点(在之前已经将所有像素点伸展为一行)。K值过小容易导致模型过拟合,而K值过大可能导致模型的近似误差增大。

xpx9826的博客 980

CS231n Spring 2019 Assignment 1—KNN

相关链接 在暑假里面粗略地学习了一下CS231n的课程,个人感觉非常有收获,对于入门深度学习中的计算机视觉特别有效。现在想通过写博客这种方式,来再一遍地找漏巩固。下面是一些课程的官方链接: 网页 说明 课程主页 这个网页上还有2015到2018的过去几年的课程链接 课程笔记 有三次作业链接和三个模块的笔记、教程 详细的教学大纲 有对应视频课程的slides,拓展阅读,也包含...

laizi_laizi的博客 1030

CS231n——Assignment1-KNN

一、KNN 1.读取数据 import numpy as np import random from cs231n.data_utils import load_CIFAR10 import matplotlib.pyplot as plt import os plt.rcParams['figure.figsize']=(10.0,8.0) plt.rcParams['ima

MargretWG的博客 1630

cs231n作业assignment1

CS231N计算机视觉公开课的作业答案,只有assignment1,其中包含了作业,还有作业的答案,还有在网上下载的数据集,都在里面了。这个作业是用的anaconda的jupyter来做的。 如果后期的软件下载,或者如何打开使用,欢迎私信,

【cs231n assignment1】knn.ipynb

最近在听斯坦福cs231n assignment1的课程,完成了assignment1的第一个作业knn.iqynb,下面把过程记录下来: import random import numpy as np from data_utils import load_CIFAR10 import matplotlib.pyplot as plt # This is a bit of magic t...

qq_40314507的博客 1118

CS231n全连接神经网络作业答案参考

这是本人手写的cs231n关于全连接神经网络的作业,可以直接运行demo,在cifar10数据集上达到了50.75%的精度,欢迎下载,共同学习交流。

cs231n assignment1 KNN

需注意的几点: 在无循环计算时: 令测试集为P(m×d),训练集为C(n×d),m为测试数据数据量,n为训练数据数据量,d是维度。 实际上最后距离公式变为如下形式 这里实现的依然是广播,所以只要P的形状为 m×1,C的形状为 1×n即可 三种循环方式体现的是运算速度的不同,结果是一致的 k = 1时,training data自身的匹自身为100%   直接执行的代码(注释掉测试部...

likyoo的博客 411

keil+Jlink GD32调试记录

Jlink+keil,GD32调试记录,踩坑及解决,持续更新。

SUN_BW的博客 2950

Allegro Design Entry CIS 与 OrCAD Capture CIS:PCB设计工具链中的双雄对决

本文深入对比了Cadence旗下两大原理图设计工具Allegro Design Entry CIS与OrCAD Capture CIS。Allegro Design Entry CIS源自Concept HDL,定位高端,强调自顶向下的层次化设计和与Allegro PCB Editor的无缝约束管理,适合大型复杂系统及团队协作。OrCAD Capture CIS则以其出色的易用性、广泛的兼容性和强大的CIS数据库功能著称,是中小型项目及跨工具链协作的通用选择。文章从历史渊源、核心功能、适用场景等多维度剖析,

bush的博客 486

cs231n:assignment1:KNN解答

本篇博客是对斯坦福大学课程cs231n中第一个作业assignment1中对k-Nearest Neighbor部分的解答,解答过程使得对Python库numpy的应用更加熟悉,以及对train/val/test集有了更深的了解,对交叉验证法有了一定的掌握。下面直接进入正题:       KNN算法基本思路:通过测试集与训练集的比较,作业中用的衡量标准是欧氏距离。比如,对于作业中的数据集,其中测

Tramac的博客 1292

告别龟速与断连:Arduino IDE下ESP32及ESP32-CAM一站式环境部署指南

本文提供Arduino IDE下ESP32及ESP32-CAM一站式环境部署指南,解决下载速度慢、断连等常见问题。通过国内镜像源加速、详细步骤讲解和ESP32-CAM专属配置技巧,帮助开发者快速完成环境搭建,避免常见陷阱,提升开发效率。

weixin_30576827的博客 771

CS231N assignment 1 KNN

cs231n 的作业一直写写停停,实在是太对不起自己了,其实作业还是挺有意思的 自己用conda create先创建了一个虚拟环境,pytorch36,链接到jupyter-notebook的kernel 具体配置jupyter的kernel以后有空再整理 1. knn.ipynb knn的作业有两个目的,一个是弄明白numpy的broadcast机制,第二个是尝试交叉验证。 from cs231...

liudiudiu 301

OFDR解调全同弱反射光纤阵列

全同弱反射光纤光栅阵列是在一根光纤上密集刻写波长相同的WFBG,由于每个光栅的反射都比较弱,可实现一根光纤上复用成千上万个光栅,阵列上每个光栅栅区长度相同,相邻光栅之间栅距相同,呈周期性分布。2、获取测量信号:对弱栅阵列加载状态下,使用OFDR系统再次获取弱栅时域曲线,为测量信号。(这里需要注意的是对弱栅阵列加载后,不能使弱栅中心波长漂移到激光器波长扫描范围之外,若超出范围则OFDR技术不能获取弱栅反射信号,因此在选择弱栅阵列波长时尽量让其中心波长在激光器波长扫描范围中间,确保温度/应变测量范围。

m0_69386663的博客 1954

Unity四部曲(核心)

需要先改成Cube复杂的展开留到unity进阶再说。

ultraman1234566的博客 2797

CS231n KNN Assignment 1算法总结

CS231n KNN Assignment 1算法总结 1.数据驱动方法:train—precdict 模式 编写k_nearest_neighbor.py这个utils文件: import numpy as np class KNearestNeighbor(object): def __init__(self): pass def train(self, X, y): ...

sansherlock的博客 334

【计算摄影】相机成像原理:从光到JPEG图像

本文我们将从最基本的相机成像原理开始论述,再讨论光线进入相机后,经过一系列处理成为JPEG图像的大致流程。

qq_35149975的博客 2万+

cs231n_assignment1_配置作业环境+kNN

作业1:http://cs231n.github.io/assignments2017/assignment1/ 我是在win7电脑上做的。 准备工作: 下载anaconda:https://www.anaconda.com/download/ 打开前修改jupyter notebook启动目录:https://www.zhihu.com/question/31600197/answ...

ChuanjieZhu 1万+

手把手式介绍 ADNI 影像数据下载

1.搜索 1.1登录 打开ADNI的官网:http://adni.loni.usc.edu/,进入下面的界面。 点击 DATA&SMPLES 下的 ACCESS DATA AND SAMPLES,如下图。 页面跳转以后点击中间的“LOGIN”,这时会跳出一个新的界面,然后在右上角输入自己的帐号、密码即可。如果没有权限可以跳转到第2部分看看如何申请权限。 登录以后选择DOWNLOAD下的 Image Collections就是搜索下载影像数据,其他还有一些学习测试数据和遗传数据。 1.2 sea

永远想不起来更新的博客 1万+

rk3576 适配摄像头 (mipi 五摄)

在RK3576上实现五路CSI摄像头方案,核心思路是充分复用其视频输入接口,并通过巧妙的软件配置来实现。

weixin_35723192的博客 178
上一篇: 吴恩达机器学习第十一周测验
下一篇: cs231n assignment1 SVM
一叶知秋Autumn
博客等级 码龄10年 170粉丝 51原创
评论 7
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值