深度学习第一次作业

由于notebook环境的配置较为麻烦,我直接使用pycharm配置本地的python环境完成了cs231n课堂的第一次作业任务。下面是具体的任务要求:

  • Q1:k-最近邻分类器

  • Q2:训练一个SVM

  • Q3:实现Softmax分类器

  • Q4:实现两层神经网络

  • Q5:更高层次的表达:图像特征

  • Q6:加分:做点其他的

    接下来一个一个问题的分析并完成代码的编写,在cs231n课堂上给出了大致的代码框架,这里也会沿用框架,但是需要自己去理解和构建整个工程。

    所有代码都上传到github中,会不断更新

Q1 :k-最近邻分类器

原理简介

最近邻分类器

分为两步:

  • 记住所有的训练样本
  • 将测试样本和训练样本一个个的对比,找到最相似的图片
    问题:容易受到噪声的影响

k-最近邻分类器

在最近邻分类器基础上寻找前k个和测试样本相似的图片,然后根据这k个图片的类别确定测试样本,可一定程度上避免噪声的影响。

代码实现

最近邻分类器

  1. 样本的读取

    这里采用和原文一样的数据集,放置的目录为\assiment1\datasets\cifar-10-batches-py

    新建文件data_utils.py,在文件中实现读取数据集的操作。

    import pickle as p
    import numpy as np
    import os
    

读取单个文件中的图片

def load_CIFAR_batch(filename):with open(filename, 'rb') as f:datadict = p.load(f, encoding='latin1')X = datadict['data']Y = datadict['labels']X = X.reshape(10000, 3, 32, 32).transpose(0, 2, 3, 1).astype("float")Y = np.array(Y)return X, Y

读取所有文件中的图片,注意到数据集中共有5个文件

def load_CIFAR10(ROOT):xs = []ys = []for b in range(1, 6):f = os.path.join(ROOT, 'data_batch_%d' % (b,))X , Y = load_CIFAR_batch(f)xs.append(X)         # 将所有batch整合起来ys.append(Y)Xtr = np.concatenate(xs)  # 使变成行向量,最终Xtr的尺寸为(50000,32,32,3)Ytr = np.concatenate(ys)del X, YXte, Yte = load_CIFAR_batch(os.path.join(ROOT, 'test_batch'))return Xtr, Ytr, Xte, Yte
  1. 把所有数据集分类,有的作为训练集有的是测试集,有的则是调参使用的验证集

    新建文件,load_Data.py

    在这里实现所有有关数据集的操作,从而获得三类数据集。后面也会用在其他的算法验证上,避免重复的工作。

    import numpy as np
    import matplotlib.pyplot as plt
    from data_utils import load_CIFAR10
    

    设置好读取参数然后读取所有的数据集,所有随机在各类里面选择一些图片显示出来,从而验证自己能成功读取到数据集数据。

    class load_data(object):def __init__(self):self.X_val = 0self.X_train = 0self.y_train = 0self.X_test = 0self.y_test = 0self.y_val = 0plt.rcParams['figure.figsize'] = (10.0, 8.0)plt.rcParams['image.interpolation'] = 'nearest'plt.rcParams['image.cmap'] = 'gray'# 载入CIFAR-10数据集cifar10_dir = 'datasets/cifar-10-batches-py'self.X_train, self.y_train, self.X_test, self.y_test = load_CIFAR10(cifar10_dir)# 看看数据集中的一些样本print('Training data shape: ', self.X_train.shape)print('Training labels shape: ', self.y_train.shape)print('Test data shape: ', self.X_test.shape)print('Test labels shape: ', self.y_test.shape)#  在各类中选择7个样本测试数据集是否读取成功classes = ['plane', 'car', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck']num_classes = len(classes)samples_per_class = 7for y, cls in enumerate(classes):idxs = np.flatnonzero(self.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 + 1plt.subplot(samples_per_class, num_classes, plt_idx)plt.imshow(self.X_train[idx].astype('uint8'))plt.axis('off')if i == 0:plt.title(cls)plt.show()passdef data_generate(self, train_num, num_validation, num_test):#  随机产生numValidation个样本作为验证数据mask = range(train_num, train_num + num_validation)self.X_val = self.X_train[mask]self.y_val = self.y_train[mask]#  随机产生trainNum个样本作为训练数据mask = range(train_num)self.X_train = self.X_train[mask]self.y_train = self.y_train[mask]#  随机产生numTest个样本作为测试数据mask = range(num_test)self.X_test = self.X_test[mask]self.y_test = self.y_test[mask]# 把图像信息变成一维的向量self.X_train = np.reshape(self.X_train, (self.X_train.shape[0], -1))self.X_test = np.reshape(self.X_test, (self.X_test.shape[0], -1))self.X_val = np.reshape(self.X_val, (self.X_val.shape[0], -1))print(self.X_train.shape, self.X_test.shape, self.X_val.shape)return self.X_train, self.y_train, self.X_val, self.y_val, self.X_test, self.y_test
    

    如果成果读取出数据的话,会显示出这样一张图片

    调用函数时只需选择训练集,测试集等的数量即可

    from load_data import load_data
    test = load_data()
    X_train, y_train, X_val, y_val, X_test, y_test = test.data_generate(4900, 100, 1000)
    
  2. 实现分类器

    新建文件nearest_neighbor.py,实现分类器的算法

    首先是训练部分,当然很简单只需要让代码记住所有的数据就好了,这里在构造函数直接就把数据存下来

        def __init__(self, x_train, y_train):self.x_train = x_trainself.y_train = y_trainpass
    

    然后就是计算距离,这里采用矩阵的开根号等numpy的内部实现

        def compute_distances(self, test):num_test = test.shape[0]num_train = self.x_train.shape[0]dists = np.zeros((num_test, num_train))dists = np.sqrt(-2 * np.dot(test, self.x_train.T) + np.sum(np.square(self.x_train), axis=1) + np.transpose([np.sum(np.square(test), axis=1)]))return dists
    

    可以看到基本上就是把下式用矩阵的方式实现了
    ∥test−train∥2=test2+train2−2×testT⋅train\left\|test-train\right\|_2=\sqrt{test^{2}+train^{2}-2\times test^{T}\cdot train} ∥test−train∥2​=test2+train2−2×testT⋅train​
    最后一步就是实现预测部分了,原理上倒是很简单。找到距离最近的图片,然后找到那个图片对应的属性并预测两个属性一样就好。

        def predict_labels(self, test, k=1):dists = self.compute_distances(test)num_test = dists.shape[0]y_prediction = np.zeros(num_test)for i in range(num_test):closest_y = self.y_train[np.argsort(dists[i])[:1]]y_prediction[i] = closest_yreturn y_prediction
    

    但是可以发现代码并不是很容易看懂,主要是应用了几个numpy的函数,下面可以仔细分析一下

        >>> x = np.array([3, 1, 2])>>> np.argsort(x)array([1, 2, 0])
    

    可以看出argsort函数首先把[3,1,2]从小到大排序,然后返回对应元素的序号。

    排序后[1,2,3],则1的序号是1,2的序号是2,3的序号是0,则返回[1,2,0]

    所以closest_y = self.y_train[np.argsort(dists[i])[:1]] 找到最小距离的图片的序号。

    最终新建nn.py,运行下面代码可以得到预测的准确率。

    import numpy as np
    from load_data import load_data
    from nearest_neighbor import nearest_neighbor
    test = load_data()
    X_train, y_train, X_val, y_val, X_test, y_test = test.data_generate(4900, 100, 1000)
    nn = nearest_neighbor(X_train, y_train)
    pre = nn.predict_labels(X_test)num_correct = np.sum(pre == y_test)
    accuracy = float(num_correct) / 500
    print('Got %d / %d correct => accuracy: %f' % (num_correct, 500, accuracy))
    

    运行得到结果

    Got 269 / 500 correct => accuracy: 0.538000

k-最近邻分类器

由于噪声的影响,不一定最近的就是同一种物品,所以提出k-最近邻分类器。思路就是取前k个较为近的图片,然后统计这k个图片中各类别的数量,认为和最多数量的类别是同一类。

在代码上只用改预测部分将其预测的逻辑修改一下便可。这里新定义一个类,继承原来的最临近分类器,重写预测的函数。

    def predict_labels(self, test, k=1):dists = self.compute_distances(test)num_test = dists.shape[0]y_prediction = np.zeros(num_test)for i in range(num_test):closest_y = self.y_train[np.argsort(dists[i])[:k]]y_prediction[i] = np.argmax(np.bincount(closest_y))return y_prediction

可以说结构和nn中一致,不同的是 closest_y = self.y_train[np.argsort(dists[i])[:k]] 取出前k个数据的标签,然后bincount函数统计各个标签出现的次数,然后argmax函数找到出现次数最多的标签,返回给y_prediction[i]。

新建knn.py,运行如下代码得到结果

import numpy as np
import matplotlib.pyplot as pltfrom load_data import load_data
from k_nearest_neighbor import k_nearest_neighbortest = load_data()
X_train, y_train, X_val, y_val, X_test, y_test = test.data_generate(4900, 100, 1000)
knn = k_nearest_neighbor(X_train, y_train)
accuracy = [11]
for i in range(1, 11):pre = knn.predict_labels(X_test, i)num_correct = np.sum(pre == y_test)print(i)print(num_correct)accuracy.append(float(float(num_correct)/500.0))
x = np.linspace(1, 1, 11)
print(accuracy)

[0.538, 0.456, 0.522, 0.536, 0.528, 0.54, 0.544, 0.554, 0.556, 0.554]

CS231n第一次作业_问题1相关推荐

  1. mysql的第一次作业_数据库入门第一次作业 - osc_2frf70qv的个人空间 - OSCHINA - 中文开源技术交流社区...

    数据库入门第一次作业 1.在某大学的<>中,用如下表来存储学生信息.其中,用户信息.星座信息和血型信息分别采用Users.Star和Blood三个表来保存,其中Users表引用了Star和 ...

  2. html5+css3第一次作业_“台风爷爷,让我作业飞走!”南京小学生写的诗都这么逆天了?...

    小学生的脑洞能有多大? 看看他们写的诗就知道了! 最近,南京游府西街小学四年(6)班孩子们 的语文作业火了, 一个个神句让老师都不得不服气. 赶紧戳图来看↓↓↓ 语文老师严杏村介绍, 原本的作业是抄写 ...

  3. html5+css3第一次作业_老娘我,饿死也不要陪孩子做手工作业,高考陪考真香!...

    现在网络上流行这么一条朋友圈谜题:妈妈最想死的时候是哪一刻? 评论区可以做到如此的工整,清一色的: "深夜加班回家一边煮泡面,一边拿奶粉罐给孩子做手工作业." "检查孩子 ...

  4. html5+css3第一次作业_在家写作业日记200字

    阅读本文前,请您先点击上面的"蓝色字体",再点击"关注",这样您就可以继续免费收到文章了.每天都有分享,完全是免费订阅,请放心关注. 导读:很多时候,同学们可能 ...

  5. 人工智能实战_第一次作业_杨佳宁_16141032

    项目 内容 这个作业属于哪个课程 班级博客 这个作业的要求在哪里 作业要求 我在这个课程的目标是 对于人工智能有一定的了解 这个作业在哪个具体方面帮助我实现目标 能够有平台支持我对于人工智能更加深入的 ...

  6. Python(140行):第一次作业_中小学数学卷子自动生成程序

    项目需要简单总结有以下几点: 用户登录操作,命令行输入用户名和密码,判断是否有该账户: 登录状态下,可选择生成题目的数量或者切换年级: 根据用户对应的小学.初中.高中三个年级生成不同难度的算术题: 文 ...

  7. JAVA57_JAVA_第一次作业_孙明明

    一.使用变量存储一下MP3信息,并打印输出 · 品牌(brand): 爱国者F928 · 重量(weight):12.4 · 电池类型(type):内置锂电池 · 价格(price):499 答案: ...

  8. 实时控制软件第一次作业总结

    作业地址 评分细则 本次作业总分10分 按时交 - 有分 晚交 - 扣本次作业一半分(5分) 抄袭 - 0分 不交 - 0分 本次作业主要是让同学们熟悉程序运行的环境,按照例程一步一步搭建环境,搭建成 ...

  9. 【软件工程1916|W(福州大学)_助教博客】团队第一次作业成绩公示

    题目 第一次作业 评分准则: 队名(最好能够体现项目内容,要求有亮点与个性):(1分) 拟作的团队项目描述:一句话(中英文不限):(1分) 队员风采:介绍每一名队员,包括成员性格.擅长的技术.编程的兴 ...

  10. 2021年春季学期-信号与系统-第一次作业参考答案-第四题

      本文是: 2021年春季学期-信号与系统-第一次作业参考答案 的参考答案. ▌第四题 应用冲激信号的抽样特性(筛选特性) 求下列各式的积分: (1) 求解: 根据δ(t)\delta \left( ...

最新文章

  1. .net中的IO体系介绍
  2. jFreeChary初探
  3. unicode表_Python数据库操作 Mysql数据库表引擎与字符集#学习猿地
  4. Swift和Objective-C的运行时编程
  5. SaaS 模式云数据仓库 MaxCompute 数据安全最佳实践
  6. 简单的 php 防注入、防跨站 函数
  7. 策略模式、上下文与内部类的思考
  8. 新的吉尼斯世界纪录 – 最快人类基因组测序,用时5 小时 2 分钟!
  9. 计算机三级信息管理技术考试大纲
  10. AIR3.0针对移动设备的高性能渲染方案
  11. kiss原则包括什么_KISS原则
  12. pyecharts中文手册
  13. USB转串口驱动(支持各平台)
  14. 计算机网络(谢希仁第7版)课后答案—— 第七章网络安全
  15. 与app开发者共享还是不共享
  16. 超市购物系统小票打印
  17. vi编辑器基础命令合集与yim初级使用
  18. 如何零成本实现微信公众号自助查券返利机器人(三)
  19. Illegal unquoted character ((CTRL-CHAR, code 9)): has to be escaped using backslash to be included i
  20. 雨听 | 英语学习笔记(十四)~作文范文:电子设备能促进教育吗?

热门文章

  1. 【滤波跟踪】捷联惯导纯惯导解算matlab实现
  2. android银行卡号扫描二维码,支付宝扫描银行卡号识别SDK
  3. 鸿蒙hpm网站,【HarmonyOS HiSpark IPC试用】用hpm获取源码方式环境-hpm安装 鸿蒙HarmonyOS技术社区PCB联盟网 - Powered by Discuz!...
  4. 王者荣耀改重复名,空白名最低战力查询助手微信小程序源码下载
  5. Hi3861开发板搭建环境
  6. Web_信息搜集(DAY2)
  7. python mac地址_如何使用Python生成MAC地址
  8. Canvas 画时钟
  9. Java开发支付宝支付功能
  10. 数控仿真模拟Keller CNC SYMplus v5.0-ISO