笔记

KNN部分

1.python中一个向量,每个元素平方后求和:

方法1

sum = 0
for item in vector:sum += item*item

方法2

summ = numpy.sum(vector**2)  # 不知可否?

2.CPU运算速度和运算量问题

只使用像素数据,求一张图片和另外5000张图片之间的L2 Distance,利用两层for循环实现。Intel® Core™ i7-4790 CPU @ 3.60GHz × 8 的配置,计算了几分钟了还没输出结果。。
怀疑是否在运算,那查看一下CPU使用率,linux系统咋看?在终端使用top命令

mortimerli@mortimerli-All-Series:~$ top

发现有一个cpu使用率100%,放心了,在运算,等着就行了。计算了大概10分钟终于输出结果了。。

3.KNN如何找到最近的m个样例(predict_labels)

  1. 首先,对于test数据集中的一张图,得找到它和training数据集中5000张图片最小的欧式距离,并返回下标:

    根据提示,查了一下numpy.argsort()

    indexes = np.argsort(dists[i,:])
    # 使用默认参数时,对一个向量的所有元素从小到大进行排序,按顺序返回下标
    
  2. 找到下标之后,要找到这些下标对应什么label,并找到最多的那个label,把它当作给这张test图片预测的标签:
    最直接的想法是,记录每一个label记录出现的次数,求最大值(感觉会有更好的方法?)

      def predict_labels(self, dists, num_classes ,  k=1):num_test = dists.shape[0]y_pred = np.zeros(num_test)for i in xrange(num_test):  # 行循环closest_samples_for_one_test_sample = np.argsort(dists[i,:])  # 对一个向量的所有元素从小到大进行排序,按顺序返回下标for j in range(k):closest_k_indexes = closest_samples_for_one_test_sample[0:k]closest_y = self.y_train[closest_k_indexes]  # 标签,是一堆数count = np.zeros(num_classes)for item in closest_y:for mm in range(num_classes):count[mm] += ((item == mm)+0)index_of_maxcount = np.argmax(count[:])print("index_of_maxcount = {}".format(index_of_maxcount))      y_pred[i] = index_of_maxcount      # END OF YOUR CODEreturn y_pred
    

4.加速计算L2 Distance(compute_distances_one_loop)

for循环num_test次,每一次要算出dists矩阵的一行,也就是用一句话计算出“一张test图片”对于“5000张train图片”分别的L2 Distance.这tm咋弄啊???

还是得做题。。。注意knn.ipnb中给出的这句话Now lets speed up distance matrix computation by using partial vectorization with one loop.注意到让我们using partial vectorization,那就可以有下面的思路(伪代码):

for i in range(num_test):1.把该张test图片reshape成行向量2.复制num_train次,成为一个[num_train行×3076列]的matrix3.复制得到的矩阵和X_train相减,对每一行求元素平方的和,得到有5000个元素的列向量4.把列向量reshape成行向量,作为dists数组的i行
return dists

其中第2步,一个行向量复制成num_train行,一开始这么写的:

test_pic_big_matrix = X[i].reshape(1,-1)  # 把一张test图变成一个行向量
for i in range(num_train-1):test_pic_big_matrix = np.vstack((test_pic_big_matrix,test_pic_big_matrix))

但不管用笔记本跑还是用台式机跑,都会卡住,然后鼠标相应迟钝。台式机强跑了一阵,输出下面的结果:

提示有MemoryError…
后来想到,和全为1的列向量相乘就行了。。改下代码:

 test_pic = X[i,:].reshape(1,-1)  # 把一张test图变成一个行向量#print('test_pic.shape = ')#print(test_pic.shape[:])test_pic = np.dot(np.ones((num_train,1)),test_pic)# 复制一下,变成5000行    #print('test_pic.shape = ')#print(test_pic.shape[:]) # 输出一下shape,看是否和X_train同型

跑一下compute_distances_one_loop()函数,输出用时:

Using time: 27.88664221763611

之后上网搜了一下其他人的写法,贴个网址,这位同学只用了一句话:
https://www.jianshu.com/p/4f062ba508f0

 for i in xrange(num_test):dists[i, :] = np.sqrt(np.sum(np.square(X[i] - self.X_train), axis=1))

笔记:

  1. X[i]表示test集的一行,即一张图,用这个东西减去self.X_train(代表train集的5000张图片),能减吗?
    答:能。得益于python 的broadcast机制。
  2. numpy的几个函数
    np.square(a)  # 计算各元素的平方
    np.sqrt(a)    # 计算各元素的平方根
    
    np.sum(a,axis = 0)  # 求每一列的和
    np.sum(a,axis = 1)  # 求每一行的和
    
  3. 深感自己的python代码能力太差,还是要加紧修炼

5.加速计算L2 Distance(compute_distances_no_loops)

这部分让我自己写我是绝对写不出来的,借鉴了上面链接里那位同学的推导思路,自己推了一遍,写出来了代码。注意下图中2.PNG部分的第一行打错了,应该是(P-C)2,而不是(P-P)2

  def compute_distances_no_loops(self, X):num_test = X.shape[0]num_train = self.X_train.shape[0]dists = np.zeros((num_test, num_train))# HINT: Try to formulate the l2 distance using matrix multiplication#       and two broadcast sums.#1aaa = np.sum(np.square(X), axis = 1)  # 求每一行中,元素平方的和,得到一个列向量part1 = np.dot(aaa.reshape(-1,1), np.ones((1, num_train)))#print('part1.shape() = ')#mm, nn = part1.shape[:]#print(mm,nn)#2bbb = np.sum(np.square(self.X_train), axis = 1)  # 求每一列中,元素平方的和,得到一个行向量part2 = np.dot(np.ones((num_test, 1)), bbb.reshape(1,-1))#print('part2.shape() = ')#mm, nn = part2.shape[:]#print(mm,nn)#3part3 = 2 * np.dot(X, self.X_train.T)#print('part3.shape() = ')    #mm, nn = part3.shape[:]#print(mm,nn)dists = np.sqrt(part1 + part2 - part3)return dists

三种方法用时比较,发现推导简化之后运算比强算要省时多了,以后还是要加强数学的学习,多动手推导一下

Two loop version took 30.614601 seconds
One loop version took 31.102188 seconds
No loop version took 0.117525 seconds

6.交叉验证

以前做交叉验证,只是把X_train和y_train用numpy.hstack()合并一下,再用numpy.shuffle()打乱顺序,留出最后一部分作为validation集,这样其实只是验证了一遍。
这次按照提示,使用numpty.array_split()把数据集给分开了,用for循环即可全部跑一遍。
另外在“菜鸟教程”查了一下如何修改dictionary中的内容,如下图:

所有代码如下:

num_folds = 5
k_choices = [1, 3, 5, 8, 10, 12, 15, 20, 50, 100]X_train_folds = []
y_train_folds = []# Hint: Look up the numpy array_split function.
#ALL_DATA = np.hstack((X_train,y_train))
#ALL_DATA = np.shuffle(ALL_DATA)
X_train_folds = np.array_split(X_train,5)
y_train_folds = np.array_split(y_train,5)# 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 = {}# Perform k-fold cross validation to find the best value of k.
# Store the accuracies for all fold and all values of k in the k_to_accuracies dictionary.
X_train = np.reshape(X_train, (X_train.shape[0], -1))  # Reshape the image data into rows
X_test  = np.reshape(X_test,  (X_test.shape[0],  -1))
classifier = KNearestNeighbor()
classifier.train(X_train, y_train)for k_value in k_choices:accuracies = np.zeros((1,num_folds))for i in range(num_folds):time_start = time.time()  # 记录起始时间dists = classifier.compute_distances_no_loops(X_test)y_test_pred = classifier.predict_labels(dists,num_classes, k=k_value)# Compute and print the fraction of correctly predicted examplesnum_correct = np.sum(y_test_pred == y_test)accuracies[0,i] = float(num_correct) / num_testtime_end = time.time()-time_startprint("k = {}, 第{}折验证,Using time: {}, accuracy = {}".format(k_value,i,time_end,accuracies[0,i]))    k_to_accuracies[k_value] = accuracies[0,:]

到这儿KNN部分就结束了。

问题

  1. tuple list dictionary array的区别??
  2. 定义函数的时候,各种类型的形参顺序有何要求?

CS231n_1_assignment1_KNN做题笔记相关推荐

  1. C语言程序设计做题笔记之C语言基础知识(下)

    C 语言是一种功能强大.简洁的计算机语言,通过它可以编写程序,指挥计算机完成指定的任务.我们可以利用C语言创建程序(即一组指令),并让计算机依指令行 事.并且C是相当灵活的,用于执行计算机程序能完成的 ...

  2. verilog练习:hdlbits网站上的做题笔记(6)

    前言 之前的文章<如何学习verilog,如何快速入门?>中提到了verilog学习,推荐了一个可以练习的网站:hdlbits网站,那自己也玩玩这个网站. 这篇文章,是接着<veri ...

  3. verilog练习:hdlbits网站上的做题笔记(5)

    前言 之前的文章<如何学习verilog,如何快速入门?>中提到了verilog学习,推荐了一个可以练习的网站:hdlbits网站,那自己也玩玩这个网站. 这篇文章,是接着<veri ...

  4. verilog练习:hdlbits网站上的做题笔记(7)!强烈推荐!

    前言 之前的文章<如何学习verilog,如何快速入门?>中提到了verilog学习,推荐了一个可以练习的网站:hdlbits网站,那自己也玩玩这个网站. 这篇文章,是接着<veri ...

  5. verilog练习:hdlbits网站上的做题笔记(8)

    前言 之前的文章<如何学习verilog,如何快速入门?>中提到了verilog学习,推荐了一个可以练习的网站:hdlbits网站,那自己也玩玩这个网站. 这篇文章,是接着<veri ...

  6. buuctf-MISC篇做题笔记(2)

    buuctf-MISC篇做题笔记(2) 第七题:基础破解 先看题目提示,可能也要暴力破解 打开后是RAR文件,需要密码 我是用RARpassword暴力破解,且根据题意已知是四位纯数字密码,设置破解的 ...

  7. 关于数据库设计的做题笔记——选择题+填空题+大题

    ✅ 一点整理后的做题笔记- 文章目录 一.选择题和填空题 二.大题 三.写后感 ● 我们用的教材: 一.选择题和填空题 逻辑设计阶段的任务包括设计视图,形成数据库的外模式.( ) A. 对 B. 错 ...

  8. 攻防世界ctf题目easyupload做题笔记。

    刚刷完upload-labs靶场,做做ctf题目,发现自己掌握的知识并不牢固.做了半天没有解出来,最后还是看别人的题解做出来的.写下做题过程,也就是wp吧.为了方便以后复习巩固. 本题的主要考点为利用 ...

  9. codetop做题笔记

    ##ACM模式 头文件: #include<bits/stdc++.h> #include<iostream> using namespace std; ##206. 反转链表 ...

最新文章

  1. 静态路由和默认路由的配置实例
  2. 自底向上的web数据操作指南
  3. Direct3D播放RGB(通过Texture)
  4. 第二阶段冲刺-个人总结04
  5. wpf datagrid 数据为null时 显示背景图_[C#.NET 拾遗补漏]09:数据标注与数据校验
  6. C++面试题-面向对象-静态成员变量以及静态成员函数
  7. OpenRowSet导入Excel大批量数据
  8. ArcGIS10.4下载及安装
  9. 孙玄/陈东:聊一聊ZooKeeper的顺序一致性
  10. Anaconda python版本降级
  11. 基于Java前后端分离的在线蛋糕销售系统(含优秀毕业论文)
  12. JUCE框架教程(8)——DSP Module基础
  13. Android基础知识总结
  14. 明翰大数据Spark与机器学习笔记V0.1(持续更新)
  15. 软件缺陷(定义+表现形式+优先级+信息+产生原因),看完这篇文章就懂了
  16. 铝碳化硅封装材料行业研究及十四五规划分析报告
  17. 如何破解加密ppt文档的密码
  18. windows xp 系统CMD命令大全(一)
  19. Linux下vsftp配置 AND ftp常用命令
  20. 热点账户冲扣设计方案

热门文章

  1. 标杆案例|新城控股数智转型:以中台赋能,建设数字化审计监察平台
  2. 修复office 2007或2010安装程序找不到Proplas ww/Proplsww cab
  3. UMOUNT NAS报错No space left on device和was not found in /proc/mounts
  4. VMware VCSA 7.0 Install
  5. 黑苹果英特尔网卡_苹果转向ARM可能会破坏英特尔
  6. 抖音X-SS-STUB算法
  7. 一文搞懂Vue Diff算法
  8. vs2008中图标的使用(使用IcoFX【免费图标制作软件】软件去除图标中的背景)
  9. Realtek5.0配置verbTable
  10. 计算机串口无法发数,单片机向电脑发送数据,为什么串口调试助手收不到数据 求助...